当我阅读https://github.com/elixir-lang/ecto/issues/389及其相关问题时,Ecto似乎支持多态关联。
让我们说我需要在任务和事件模型上建立评论模型关联。如果我对Ecto与自定义源的关联是正确的,那么我们需要四个表和三个模型,
表
模型
任务和事件模型将具有与自定义源的has_many关联,如下所示。
defmodule ExampleApp.Task do
use ExampleApp.Web, :model
schema "tasks" do
field :title, :string
field :body, :string
has_many :comments, {"tasks_comments", Comment}
timestamps
end
end
defmodule ExampleApp.Event do
use ExampleApp.Web, :model
schema "events" do
field :title, :string
field :body, :string
has_many :comments, {"events_comments", Comment}
timestamps
end
end
现在我不明白的是评论模型应该如何?
Comment模型如何处理两个表?以及它如何处理不同模型的belongs_to关联?
答案 0 :(得分:19)
如果您使用上述设计,则注释模型实际上没有任何表,其表由关联定义。因此,要获得所有事件的所有评论,您可以这样做:
from c in {"events_comments", Comment}
在某些情况下,这是一项很棒的技术,它允许您不将存储(表格)与模型耦合。您可以对不同的表使用相同的模型。
但是,如果要获取所有注释并将它们与事件和任务相关联,则可以使用关系。您将拥有“事件”< - > “events_comments”< - > “评论”和“任务”< - > “tasks_comments”< - > “注释”。
另一种方法是使用Rails方式进行多态关联,并在Comment模型中定义“kind”列。它确实打破了数据库引用,但它是另一种解决这个问题的方法。
我会就此事改进Ecto文档,感谢您的反馈!