elixir - has_one 在 ecto/phoenix/elixir 中没有belongs_to

标签 elixir phoenix-framework ecto

问题
我有一个 files表,还有许多其他表可以创建一对一关联,例如users可能有 avatarposts可能有 photo .
一个可能的解决方案
一个可能的解决方案是创建 users_filesposts_files表和使用 has_one :through .然而,这看起来太过分了。
理想的解决方案
理想的解决方案是定义这样的表

users
 - avatar_id

posts
 - photo_id
并有 with: has_one 中的参数所以架构看起来像这样
schema "users" do
    has_one :avatar, MyApp.FileDb, with: :avatar_id, foreign_key: :id #id is default

end

schema "posts" do
    has_one :photo, MyApp.FileDb, with: :photo_id, foreign_key: :id

end
这样你就不需要定义 belongs_tofiles .已经有类似的机制了吗?在 Phoenix 处理这个问题的标准方法是什么?

最佳答案

您无法避免没有belongs_to,因为那是定义外键的地方。您有两种选择:

  • 翻转关系,使用户和帖子都有指向文件表的 avatar_id 和 photo_id
  • 定义没有“files”表的“users_files”和“posts_files”表。 "users_files"和 "posts_files"将具有完整的表结构,可以在 Ecto 中的模型级别共享。我们实际上在 Ecto 文档中讨论了这个案例:http://hexdocs.pm/ecto/Ecto.Schema.html#belongs_to/3 (见多态部分)
  • 关于elixir - has_one 在 ecto/phoenix/elixir 中没有belongs_to,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32670161/

    相关文章:

    phoenix-framework - 未加载返回到父级的子级关联

    elixir - Ecto:将 %Plug.Upload 转换到虚拟字段以进行文件上传验证

    elixir - 在 Elixir 中模拟三元运算符

    elixir - 如何让phoenix+ecto中的表单和事务玩的好?

    elixir - Elixir 和 Ecto 中的 DateTime.now

    elixir - 在 Ecto 查询中使用变量引用命名绑定(bind)

    elixir - __using__ 内嵌套 use 语句的别名

    sql - 带有条件 where 的 Ecto 片段子查询

    elixir - dev.ex Elixir Phoenix 中的 System.get_env

    elixir - 为守护者配置设置 key - Phoenix