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.
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.
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.
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.
Tags und Links ruby-on-rails activerecord associations