当我通读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关联?
发布于 2015-05-16 15:43:24
如果你采用上面的设计,评论模型实际上没有任何表,它的表是由关联定义的。因此,要获取所有事件的所有评论,您可以执行以下操作:
from c in {"events_comments", Comment}
在某些情况下,这是一个很好的技术,它允许您不将存储(表)与模型耦合。您可以对不同的表使用相同的模型。
但是,如果您希望获取所有注释并将它们与事件和任务相关联,则可以使用通过关系。您将拥有"events“<-> "events_comments”<-> "comments“和"tasks”<-> "tasks_comments“<-> "comments”。
另一种方法是使用Rails的方式进行多态关联,并在注释模型中定义一个"kind“列。它确实破坏了数据库引用,但它是解决这个问题的另一种方法。
我会在这个问题上改进Ecto文档,谢谢你的反馈!
https://stackoverflow.com/questions/30272471
复制相似问题