【问题标题】:Ecto preload nestedEcto 预加载嵌套
【发布时间】:2017-10-08 00:30:09
【问题描述】:

我正在学习 phoenix 和 ecto 关联,但在尝试预加载嵌套关联时偶然发现了一个似乎无法解决的问题。我有 3 个架构

提供有

schema "offers" do
    ...
    has_one :albumMariageSmall, Album, on_delete: :delete_all, on_replace: :delete
    has_one :prewedding, Prewedding, on_delete: :delete_all, 
    on_replace: :delete
    has_one :next_day, Prewedding, on_delete: :delete_all, on_replace: :delete
end

现在,婚礼前的样子

schema "preweddings" do
    ...
    has_one :album, Album, on_delete: :delete_all, on_replace: :delete
end

专辑看起来像

schema "albums" do
    ...
    belongs_to :offer, Offer
    belongs_to :prewedding, Prewedding
end

换句话说,一个offer可以有一个Album和两个Prewedding,其中Prewedding可以有一个Album。

在数据库方面,:preweddings 通过 offer_id 引用报价,:albums 通过 offer_id 引用报价,而 preweddings 通过 prewedding_id 引用。

我无法加载任何已保存的报价,因为 :prewedding 和 :next_day 在我检查时似乎指向同一行。

我正在尝试使用预加载

offer=Repo.one from(o in Offer, preload: [{:prewedding, [:album]},{:next_day, [:album]}], select: o, where: o.id==^id)

我认为我可以让它与连接一起工作,但我很固执地想要进行预加载。

有人可以帮忙吗?

婚前迁移就是这样

add :included, :boolean, default: false, null: false
add :offer_id, references(:offers)

专辑有

add :offer_id, references(:offers)
add :prewedding_id, references(:preweddings)

【问题讨论】:

  • 你能发布你的“婚礼前”迁移吗?您可能需要为“offers”中的两个has_one 指定一个自定义foreign_key,否则它们都将指向offer_id 列。
  • mmm 没有自定义外键,当我尝试时,我添加到相册(参考)。让我看看。
  • 好吧,如果你想要两个相同的has_one,你需要在婚礼前的两列指向报价。现在两者都使用offer_id,这意味着两者具有相同的值。
  • 我不太确定我知道如何实现它。你能详细说明一下吗?
  • 好的,知道了!你的 cmets 最终让我明白了 :)

标签: elixir phoenix-framework ecto


【解决方案1】:

默认情况下,当使用has_one时,外键是从当前表的名称推断出来的,例如offers -> offer_id。由于您有两个 has_one 并且您没有为任何一个指定自定义外键,因此两者都将使用 offer_id 作为外键,因此将始终具有相同的值。您需要为两个has_one 指定正确的外键。例如,如果您的 preweddings 表有此迁移:

add :offer_prewedding_id, references(:offers)
add :offer_next_day_id, references(:offers)

你需要做的:

has_one :prewedding, Prewedding, on_delete: :delete_all, on_replace: :delete, foreign_key: :offer_prewedding_id
has_one :next_day, Prewedding, on_delete: :delete_all, on_replace: :delete, foreign_key: :offer_next_day_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2014-09-02
    • 1970-01-01
    相关资源
    最近更新 更多