【问题标题】:Preload all Relationships预加载所有关系
【发布时间】:2016-05-06 01:59:13
【问题描述】:

我有一个与此类似的 ERM:

--------     --------     --------
|ModelA|-----|ModelB|-----|ModelC|
--------     --------     --------

我得到了 ModelA 和它的 ModelB,如下:

modela = Repo.get(ModelA,1)
modela = preload(modela, :modelb)

现在我可以使用modela.modelb 访问ModelBs。但是我怎样才能预加载ModelC 呢?当我打印我的 modelA 时,它说没有加载 modelc。

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

    您可以将列表传递给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} 传递元组以进行高级预加载 - 在许多关联中指定排序特别有用。

    您可以在Ecto.Query.preload/3 docs 中阅读更多关于预加载的文档

    【讨论】:

    • 如果我这样做,它表示 ModelA 与 ModelC 没有关联
    【解决方案2】:

    尚不能评论,但您必须在 ModelA 中定义嵌套关系。见Ecto.Schema

    has_one :model_c, through: [:model_b, :model_c]

    【讨论】:

      【解决方案3】:

      您可以使用一个管道回购查询预加载模型 B 和它的模型 C 关联,而不必在模型 A 的模型定义中包含模型 A 和模型 C 之间的关联:

      modela = Repo.get(ModelA, 1)
               |> Repo.preload(:modelb)
               |> Repo.preload(modelb: :modelc)
      

      【讨论】:

        猜你喜欢
        • 2015-02-28
        • 2021-07-19
        • 2018-09-26
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多