假设我有两个模型,Post
和Comment
,评论模型可以是2种类型中的1种,normal
和fancy
由列定义type
表格中的comments
。
现在我想在我的Post
模型上添加2个关联,其中一个引用花哨的注释,一个引用正常注释,我该怎么做?所以我想要这样的东西:
has_many :fancy_comments, MyApp.Comment, where: [type: 0]
has_many :normal_comments, MyApp.Comment, where: [type: 1]
答案 0 :(得分:17)
这在Ecto中不可用,this GitHub issue上有关于它的冗长讨论。
您可以使用可组合查询:
defmodule MyApp.Comment do
...schema, etc.
def fancy(query) do
from c in query,
where: type == 0
end
def normal(query) do
from c in query,
where: type == 1
end
end
然后,您可以使用has_many :comments, MyApp.Comment
并根据该查询进行查询:
assoc(post, :comments) |> Comment.fancy() |> Repo.all()
以下是关于composable queries的博文。
您还可以使用带有查询的预加载:
fancy_query = from(c in Comments, where: type == 0)
Repo.preload(post, comments: fancy_query)
答案 1 :(得分:3)
条件关联现在在Ecto
中可用:https://hexdocs.pm/ecto/Ecto.Schema.html#has_many/3-filtering-associations
defmodule Post do
use Ecto.Schema
schema "posts" do
has_many :public_comments, Comment, where: [public: true]
end
end