预加载所有关系

Preload all Relationships

我有一个与此类似的 ERM:

--------     --------     --------
|ModelA|-----|ModelB|-----|ModelC|
--------     --------     --------

我得到的 ModelA 及其 ModelB 如下:

modela = Repo.get(ModelA,1)
modela = preload(modela, :modelb)

现在我可以使用 modela.modelb 访问 ModelB。但是我怎样才能预加载 ModelC 呢?当我打印我的 modelA 时,它说,modelc 没有加载。

您可以将列表传递给 Repo.preload 以加载多个关联。您甚至可以传递关键字列表来预加载嵌套关联。 我还发现在查询本身中加载我需要的所有内容很有用(下面这两个选项是等效的):

query = from m in ModelA, preload: [modelb: :modelc]
Repo.get(query, 1)

Repo.get(ModelA, 1) |> Repo.preload(modelb: :modelc)

您还可以使用 {association_name, query} 传递元组以进行高级前置 - 在许多关联中特别有用以指定顺序。

您可以在 Ecto.Query.preload/3 docs

中阅读更多关于预加载的文档

还不能发表评论,但你必须在ModelA中定义嵌套关系。参见 Ecto.Schema

has_one :model_c, through: [:model_b, :model_c]

您可以使用一个管道 Repo 查询预加载模型 B 和它的模型 C 关联,而不必在模型 A 的模型定义中包含模型 A 和模型 C 之间的关联:

modela = Repo.get(ModelA, 1)
         |> Repo.preload(:modelb)
         |> Repo.preload(modelb: :modelc)