Rails: Speichern Sie einen Datensatz über hingocs_to und setzen Sie den Fremdschlüssel ein
-
21-09-2019 - |
Frage
Gibt es eine bessere Möglichkeit, diesen Code zu schreiben? Es sitzt einfach nicht richtig mit mir, ich habe das Gefühl, dass es etwas wirklich 'Schienen wie' gibt, das ich bereits wissen sollte:
belongs_to :parent_in_use
belongs_to :parent_template
def after_create
new_parent_in_use = ParentInUse.create!(self.parent_template.attributes)
self.update_attribute(:parent_in_use_id, new_parent_in_use.id)
end
Nach dem Erstellen eines Datensatzes nehme ich die ausgewählte übergeordnete Vorlage und erstelle a parent_in_use
Aufzeichnung basierend darauf. Auf diese Weise kann sich die Vorlage ändern und der In -_use -Datensatz wird für immer mit meinem Objekt leben. Sowohl die Parentinuse- als auch die ParentTemplate -Klassen erben über Eltern mit STI.
Ich bin mir sicher, dass dies einfach genug sein sollte, aber ich weiß nicht, wie es geht, im Grunde möchte ich den Datensatz in einer Operation erstellen.
Lösung
Dies wird das tun, wonach Sie suchen.
def after_create
self.parent_in_use = ParentInUse.create!(parent_template.attributes)
end
Ohne andere Änderungen wird es Ihnen jedoch nicht gut tun. Da der Fremdschlüssel im aktuellen Modell gespeichert ist, speichert ActiveCord die Änderung nicht, wenn dieser Assoziation durch einen Rückruf von After_Create erstellt wird. Das neue ParentInuse -Objekt wird gespeichert, die Datenbankzeile für das aktuelle Modell wird jedoch nicht mit diesem entsprechenden parent_in_use_id aktualisiert.
Nennen Sie es als Vorabruf zurück und die Dinge werden reibungsloser.