2017-10-07 3 views
0

Ich lerne Phönix- und Ecto-Assoziationen, aber ich bin auf ein Problem gestoßen, das ich scheinbar nicht lösen kann, während ich versuche, verschachtelte Assoziationen zu laden. Ich habe 3-SchemataEcto preload verschachtelt

Angebot, das jetzt

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 

hat, sieht der Prewedding wie

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

und das Album sieht aus wie

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

Mit anderen Worten, kann ein Angebot Habe ein Album und zwei Preweddings, bei denen Prewedding ein Album haben kann.

Datenbankweise referenziert das: preweddings das Angebot über offer_id und das: album referenziert die Angebote durch offer_id und die Preweddings durch prewedding_id.

Ich habe Probleme beim Laden eines gespeicherten Angebot als beide: prewedding und: next_day scheinen auf die gleiche Zeile zeigen, wenn ich inspiziere.

ich vorzuladen versuche mit

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

Ich nehme an, ich kann es mit Verknüpfungen funktioniert, aber ich bin stur genug tun Vorbelastung zu wollen.

Kann jemand helfen?

Migration von preweddings gerade dieses

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

Album hat

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

Können Sie Ihre Migrationen von "preweddings" posten? Wahrscheinlich müssen Sie für die beiden "has_one" in "offers" einen benutzerdefinierten "foreign_key" angeben, oder beide werden auf die Spalte "offer_id" zeigen. – Dogbert

+0

mmm es gibt keine benutzerdefinierten Fremdschlüssel und wenn ich es versuchte, fügte ich dem Album (Referenzen) hinzu. Lass mich sehen. –

+0

Nun, Sie brauchen zwei Spalten in Preweddings, die auf Angebote zeigen, wenn Sie zwei 'has_one' wollen, die das gleiche tun. Im Moment benutzen beide 'offer_id', was bedeutet, dass beide identische Werte haben. – Dogbert

Antwort

0

standardmäßig, wenn has_one Verwendung der Fremdschlüssel aus dem Namen der aktuellen Tabelle zu entnehmen ist, z.B. offers ->offer_id. Da Sie zwei has_one haben und Sie keinen benutzerdefinierten Fremdschlüssel für beide angeben, verwenden beide als Fremdschlüssel und haben daher immer den gleichen Wert. Sie müssen die korrekten Fremdschlüssel für die beiden has_one angeben. wenn Ihr preweddings Tabelle diese Migration hat zum Beispiel:

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

Sie tun müssen:

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