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

Cri*_*cia 4 elixir ecto phoenix-framework

问题

我有一个files表,还有许多其他表创建一对一的关联,例如users可能有一个avatarposts可能有photo.

可能的解决方案

一种可能的解决方案是创建users_filesposts_files表格和使用has_one :through.但是,这看起来过分了.

理想的解决方案

理想的解决方案是定义这样的表

users
 - avatar_id

posts
 - photo_id
Run Code Online (Sandbox Code Playgroud)

并且有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
Run Code Online (Sandbox Code Playgroud)

这样你就不需要定义一个belongs_toon files.是否有类似的机制?在凤凰城处理这个问题的标准方法是什么?

Jos*_*lim 9

你不能没有没有belongs_to,因为那是定义外键的地方.你有两个选择:

  1. 翻转关系,以便用户和帖子都有指向文件表的avatar_id和photo_id

  2. 在没有"files"表的情况下定义"users_files"和"posts_files"表."users_files"和"posts_files"将具有完整的表结构,可以在Ecto中的模型级别共享.我们实际上在Ecto文档中讨论了这个案例:http://hexdocs.pm/ecto/Ecto.Schema.html#belongs_to/3 (参见多态部分)