Ecto预载嵌套
问题描述:
我正在学习凤凰和ecto协会,但我偶然发现了一个问题,我似乎无法解决,同时尝试预载嵌套关联。我有3种模式Ecto预载嵌套
有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
现在
的报价,Prewedding貌似
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
换句话说,发价有一个相册和两个Prewedding,其中Prewedding可以有一个相册。
数据库方面,preweddings通过offer_id引用报价,并且:专辑通过offer_id引用报价并通过prewedding_id进行预安装。
我无法加载任何保存的报价,因为两者:prewedding和:next_day似乎指向同一行,当我检查。
我试图用
offer=Repo.one from(o in Offer, preload: [{:prewedding, [:album]},{:next_day, [:album]}], select: o, where: o.id==^id)
预载我以为我可以把它与连接的工作原理,但我有足够的固执的想要做的预紧力。
有人可以协助吗?
preweddings的迁移是眼前这个
add :included, :boolean, default: false, null: false
add :offer_id, references(:offers)
专辑有
add :offer_id, references(:offers)
add :prewedding_id, references(:preweddings)
答
默认情况下,使用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
你可以发布你的 “preweddings” 的迁移?您可能需要在“offers”中为这两个'has_one'指定一个自定义'foreign_key',或者它们都将指向'offer_id'列。 – Dogbert
mmm没有自定义外键,当我尝试时,我添加到相册(参考)。让我看看。 –
那么,如果你想要两个'has_one'完成相同的操作,你需要两个预先指定的列。现在两者都使用'offer_id',这意味着两者都具有相同的值。 – Dogbert