在 Ecto 中预加载深层嵌套关联

Preloading deeply nested associations in Ecto

很清楚如何预加载 Ecto 1-2 层深度的关联,例如 post 和评论。

我有一个AddressAddressbelongs_to一个StreetStreetbelongs_to一个City,andCitybelongs_to区域,andRegionbelong_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/3Ecto.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)