在Ecto中建立一个3层深度的关系 - 如何预加载

时间:2017-03-28 13:33:59

标签: elixir phoenix-framework ecto

我的项目中有很多级别的模型关系。在控制器中我有这个:

var1 = Repo.get!(Model1, 123) |> Repo.preload([child_items1:  :child_items2])

这很好但我必须更深入一级。

即每个child_items2多个child_items3。现在,我如何为每个child_items3预加载child_items2

2 个答案:

答案 0 :(得分:0)

我通常使用范围。例如,在我的模型(1)中,我将有一个预加载Model2的with_model2函数。所以要连续加载3个关联,我会有类似的东西:

def with_model2(query \\ __MODULE__) do
  from query, preload: [model2: ^Model2.with_model3]
end

我的模特(1)。然后你明白了,Model2会有

def with_model3(query \\ __MODULE__) do
  from query, preload: :model3
end

我实际上从来没有达到过3级,但我只是假设它会起作用。

答案 1 :(得分:0)

对于其他人: documentation实际上说: 嵌套关联也可以两种格式预加载:

Repo.all from p in Post,
       preload: [comments: :likes]

或在一个查询中

Repo.all from p in Post,
       join: c in assoc(p, :comments),
       join: l in assoc(c, :likes),
       where: l.inserted_at > c.updated_at,
       preload: [comments: {c, likes: l}]