【问题标题】:a 3 level deep relationship in Ecto -- how to preloadEcto 中的 3 级深度关系——如何预加载
【发布时间】:2018-02-14 17:38:53
【问题描述】:

我的项目中有相当多的模型关系。在控制器中我有这个:

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

这很好,但我必须更深一层。

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

【问题讨论】:

  • 试试Repo.get!(Model1, 123) |> Repo.preload([child_items1: [child_items2: :child_items3]),看看会发生什么。
  • 为我工作!这应该是一个答案而不是评论

标签: elixir phoenix-framework ecto


【解决方案1】:

我通常使用范围。例如,在我的 Model(1) 中,我将有一个 with_model2 函数来预加载 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 级深度,但我只是假设这会奏效。

【讨论】:

    【解决方案2】:

    对于其他人: 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}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多