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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top