Ecto与条件的关联

时间:2015-10-23 03:18:06

标签: elixir phoenix-framework ecto

假设我有两个模型,PostComment,评论模型可以是2种类型中的1种,normalfancy由列定义type表格中的comments

现在我想在我的Post模型上添加2个关联,其中一个引用花哨的注释,一个引用正常注释,我该怎么做?所以我想要这样的东西:

has_many :fancy_comments, MyApp.Comment, where: [type: 0]
has_many :normal_comments, MyApp.Comment, where: [type: 1]

2 个答案:

答案 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