2017-10-07 81 views
0

我正在學習鳳凰和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

回答

0

默認情況下,使用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