预加载所有关系
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}
传递元组以进行高级前置 - 在许多关联中特别有用以指定顺序。
中阅读更多关于预加载的文档
还不能发表评论,但你必须在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)
我有一个与此类似的 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}
传递元组以进行高级前置 - 在许多关联中特别有用以指定顺序。
还不能发表评论,但你必须在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)