2017-10-07 2 views
0

フェニックスとエクトーの関連を学んでいますが、ネストされた関連付けを事前ロードしようとしているときに解決できないような問題が発生しました。私が持っている3つのスキーマEcto preload nested

は 今

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はアルバムを持つことができるアルバムと2つのPreweddingを持っている。

データベース:ww:preweddingsはoffer_idを通じてオファーを参照しています::albumsはoffer_idを通じてオファーを参照し、prewedding_idを介してpreweddingsを参照しています。

保存済みのオファーを読み込む際に問題があります。プリウィングと: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" のあなたの移行を投稿することができますか? "オファー"に2つの 'has_one'のカスタム' foreign_key'を指定する必要があるか、どちらも 'offer_id'カラムを指します。 – Dogbert

+0

mmmカスタム外部キーはありません。試してみると、アルバム(参考文献)に追加されました。そうねぇ。 –

+0

まあ、2つの 'has_one'が同じになるようにするには、オファーを指し示すpreweddingsに2つの列が必要です。今は両方とも 'offer_id'を使用しています。これはどちらも同じ値を持つことを意味します。 – Dogbert

答えて

0

を有するhas_oneを使用した場合、外部キーは、例えば、現在のテーブルの名前から推測されoffers - >offer_idhas_oneが2つあり、いずれかにカスタム外部キーを指定していないため、両方とも外部キーとしてoffer_idを使用するため、常に同じ値になります。 2つの正しい外部キーを指定する必要があります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