【问题标题】:Preloading deeply nested associations in Ecto在 Ecto 中预加载深度嵌套的关联
【发布时间】:2019-02-20 22:32:29
【问题描述】:

很清楚如何在 Ecto 1-2 层中预加载关联,例如 post 和 cmets。

我有一个AddressAddress belongs_to 一个StreetStreet belongs_to 一个CityCity belongs_to 地区和Region 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}")

?

【问题讨论】:

    标签: elixir ecto


    【解决方案1】:

    根据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)
    

    【讨论】:

    • 与街道相同级别的预加载怎么样?还是城市?喜欢preload(street: [city: [], base: [] ], boulevard: [])
    • 是的,这应该可以。另外,如果你没有城市和基地的任何子依赖,你可以简单地写preload(street: [:city, :base], boulevard: [])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多