首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >多态关联是如何与Ecto一起工作的?

多态关联是如何与Ecto一起工作的?
EN

Stack Overflow用户
提问于 2015-05-16 14:17:53
回答 1查看 4.1K关注 0票数 18

当我通读https://github.com/elixir-lang/ecto/issues/389和它的相关链接时,Ecto似乎支持多态关联。

假设我需要一个任务和事件模型的注释模型关联。如果我对Ecto与自定义源代码的关联的理解是正确的,那么我们需要四个表和三个模型,

表格

  • tasks
  • events
  • tasks_comments
  • events_comments

模型

  • Task
  • Event
  • Comment

任务和事件模型将具有与自定义源的has_many关联,如下所示。

代码语言:javascript
复制
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关联?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-16 15:43:24

如果你采用上面的设计,评论模型实际上没有任何表,它的表是由关联定义的。因此,要获取所有事件的所有评论,您可以执行以下操作:

代码语言:javascript
复制
from c in {"events_comments", Comment}

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

但是,如果您希望获取所有注释并将它们与事件和任务相关联,则可以使用通过关系。您将拥有"events“<-> "events_comments”<-> "comments“和"tasks”<-> "tasks_comments“<-> "comments”。

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

我会在这个问题上改进Ecto文档,谢谢你的反馈!

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30272471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档