在 Ecto 中预加载深层嵌套关联
Preloading deeply nested associations in Ecto
很清楚如何预加载 Ecto 1-2 层深度的关联,例如 post 和评论。
我有一个Address
,Address
belongs_to一个Street
,Street
belongs_to一个City
,andCity
belongs_to区域,andRegion
belong_to一个Country
给定 Address
:
addr = Repo.get(Address, 123)
|> Repo.preload(street: ?????)
如何将其预加载到 Country
:
IO.puts("the name of country: #{addr.street.city.region.country.name}")
?
根据 the docs Repo.preload/3
与 Ecto.Query.preload/3
类似,您可以将嵌套的预加载列表传递给它们。
示例:
使用Repo.preload/3
:
addr =
Address
|> Repo.get(123)
|> Repo.preload(street: [city: [region: :country]])
IO.inspect(addr.street.city.region.country)
使用Ecto.Query.preload/3
:
addr =
Address
|> Ecto.Query.where(id: 123)
|> Ecto.Query.preload(street: [city: [region: :country]])
|> Repo.one()
IO.inspect(addr.street.city.region.country)
很清楚如何预加载 Ecto 1-2 层深度的关联,例如 post 和评论。
我有一个Address
,Address
belongs_to一个Street
,Street
belongs_to一个City
,andCity
belongs_to区域,andRegion
belong_to一个Country
给定 Address
:
addr = Repo.get(Address, 123)
|> Repo.preload(street: ?????)
如何将其预加载到 Country
:
IO.puts("the name of country: #{addr.street.city.region.country.name}")
?
根据 the docs Repo.preload/3
与 Ecto.Query.preload/3
类似,您可以将嵌套的预加载列表传递给它们。
示例:
使用Repo.preload/3
:
addr =
Address
|> Repo.get(123)
|> Repo.preload(street: [city: [region: :country]])
IO.inspect(addr.street.city.region.country)
使用Ecto.Query.preload/3
:
addr =
Address
|> Ecto.Query.where(id: 123)
|> Ecto.Query.preload(street: [city: [region: :country]])
|> Repo.one()
IO.inspect(addr.street.city.region.country)