多态关联如何与Ecto一起使用?

时间:2015-05-16 06:17:53

标签: elixir phoenix-framework

当我阅读https://github.com/elixir-lang/ecto/issues/389及其相关问题时,Ecto似乎支持多态关联。

让我们说我需要在任务和事件模型上建立评论模型关联。如果我对Ecto与自定义源的关联是正确的,那么我们需要四个表和三个模型,

  • 任务
  • 事件
  • tasks_comments
  • events_comments

模型

  • 任务
  • 事件
  • 注释

任务和事件模型将具有与自定义源的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关联?

1 个答案:

答案 0 :(得分:19)

如果您使用上述设计,则注释模型实际上没有任何表,其表由关联定义。因此,要获得所有事件的所有评论,您可以这样做:

from c in {"events_comments", Comment}

在某些情况下,这是一项很棒的技术,它允许您不将存储(表格)与模型耦合。您可以对不同的表使用相同的模型。

但是,如果要获取所有注释并将它们与事件和任务相关联,则可以使用关系。您将拥有“事件”< - > “events_comments”< - > “评论”和“任务”< - > “tasks_comments”< - > “注释”。

另一种方法是使用Rails方式进行多态关联,并在Comment模型中定义“kind”列。它确实打破了数据库引用,但它是另一种解决这个问题的方法。

我会就此事改进Ecto文档,感谢您的反馈!