预加载所有关系

0xA*_*ffe 4 elixir ecto phoenix-framework

我有一个类似于这个的ERM:

--------     --------     --------
|ModelA|-----|ModelB|-----|ModelC|
--------     --------     --------
Run Code Online (Sandbox Code Playgroud)

我得到了ModelA及其ModelBs,具体如下:

modela = Repo.get(ModelA,1)
modela = preload(modela, :modelb)
Run Code Online (Sandbox Code Playgroud)

现在我可以访问ModelBs了modela.modelb.但我怎么能预装ModelC呢?当我打印我的modelA时,它说,没有加载modelc.

mic*_*ala 10

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

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

Repo.get(ModelA, 1) |> Repo.preload(modelb: :modelc)
Run Code Online (Sandbox Code Playgroud)

您还可以传递元组以{association_name, query}进行高级预编码 - 在许多关联中特别有用,以指定排序.

您可以在文档中阅读有关预加载的更多Ecto.Query.preload/3文档