Rails - build_association funktioniert nicht für eine has_one- und provides_to-Beziehung

8

Ich habe zwei Modelle

%Vor%

Aber wenn ich versuche, ein Elternteil vom Kind zu erstellen, z. sub.build_client Der Fremdschlüssel wird nicht gesetzt, z. B.

%Vor%

Es funktioniert, wenn ich client.build_subscription

mache %Vor%

Ich habe drei Stunden damit verbracht, herumzuhacken und bin nicht schnell gelandet. Kann jemand erklären, was ich falsch mache, Dinge zu überprüfen usw.

    
robodisco 11.01.2010, 06:14
quelle

5 Antworten

9

Gemäß Ihren Modellassoziationen ist Subscription ein Kind von Client .

Wenn Sie zuerst eine Subskription erstellen und dann einen Client gemäß Ihrem ersten Beispiel erstellen, kann Rails keinen client_id Fremdschlüsselwert in der Tabelle subscriptions festlegen, da Sie den Client zu diesem Zeitpunkt noch nicht erstellt haben aufnehmen, so dass nichts mit dem Abonnement zu tun hat. Aus diesem Grund müssen Sie zuerst den übergeordneten Datensatz (d. H. Einen Client) erstellen und ihn dann mithilfe der build_subscription -Methode mit einem untergeordneten Subskriptionsdatensatz verknüpfen.

    
John Topley 11.01.2010, 10:03
quelle
3

Es funktioniert nicht in beide Richtungen, ein Elternteil kann ein Kind mit der build_association-Methode erstellen, aber nicht umgekehrt.

lesen Sie: Ссылка

    
keikun17 11.01.2010 10:10
quelle
1

In meinen Projekten habe ich viele ähnliche Assoziationen, aber ich verbiete oft, client_id auf null zu setzen, also kann ich kein untergeordnetes Objekt ohne übergeordnetes Objekt erstellen.

Versuchen:

%Vor%

Erzeugt und speichert beide Objekte.

    
klew 11.01.2010 10:12
quelle
1

Dies scheint in Rails 4.2.5 oder früher behoben worden zu sein. (Ich bin nicht sicher, was die früheste Version mit dem Update ist. Ich habe nur 4.2.5 getestet.)

Wenn das übergeordnete Element gespeichert wird, wird nach dem Einfügen des übergeordneten Datensatzes automatisch ein Update ausgeführt, um die übergeordnete ID zum untergeordneten Datensatz hinzuzufügen.

Ich habe jedoch keine Dokumentation über dieses Verhalten, den relevanten Code oder automatisierte Tests gefunden, daher bin ich mir nicht sicher, ob dies absichtlich behoben wurde und auf dieses Verhalten sollte man sich verlassen. Es ist vielleicht am besten, bei den Lösungen in den anderen Antworten hier zu bleiben.

Dies scheint in Rails 4.2.5 auch für has_many zu sein.

    
David Winiecki 02.01.2016 05:20
quelle
0

In einem der Kommentare fragen Sie, warum die Methode build_client da ist. Wenn Sie den Client speichern und dann die client_id auf sub überprüfen, ist es null, aber wenn Sie auch

aufgerufen hätten %Vor%

und dann die client_id auf sub überprüft, es würde existieren. Also, obwohl es ein extra Speichern erforderte, macht es immer noch die Magie, den Fremdschlüssel für sub einzurichten.

    
mackshkatz 27.04.2013 15:45
quelle