在 Ecto 中预加载深度嵌套的关联

Jod*_*ari 5 elixir ecto

很清楚如何在 Ecto 1-2 层深预加载关联,例如发布和评论。

我有一个AddressAddress belongs_to的一个Street,和 Street belongs_to的一个City,和City belongs_to的地区,并Region belong_toCountry

鉴于Address

addr = Repo.get(Address, 123)
|> Repo.preload(street: ?????)
Run Code Online (Sandbox Code Playgroud)

我如何预加载到Country

IO.puts("the name of country: #{addr.street.city.region.country.name}")
Run Code Online (Sandbox Code Playgroud)

?

Boh*_*ipa 9

根据文档 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)
Run Code Online (Sandbox Code Playgroud)

使用 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)
Run Code Online (Sandbox Code Playgroud)