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) 
+0

你可以发布你的 “preweddings” 的迁移?您可能需要在“offers”中为这两个'has_one'指定一个自定义'foreign_key',或者它们都将指向'offer_id'列。 – Dogbert

+0

mmm没有自定义外键,当我尝试时,我添加到相册(参考)。让我看看。 –

+0

那么,如果你想要两个'has_one'完成相同的操作,你需要两个预先指定的列。现在两者都使用'offer_id',这意味着两者都具有相同的值。 – Dogbert

默认情况下,使用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