Rails: salvare un record tramite belongs_to e impostando la chiave esterna
-
21-09-2019 - |
Domanda
C'è un modo migliore di scrivere questo codice? Semplicemente non sedersi proprio con me, mi sento come se ci fosse qualcosa di veramente 'rotaie, come' che dovrei già sapere:
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
Dopo aver creato un record mi prendo il modello principale selezionato e la creazione di un record parent_in_use
basato su di esso. In questo modo il modello può cambiare e il record in_use vivranno con il mio oggetto per sempre. Entrambe le classi ParentInUse e ParentTemplate ereditano da Parent utilizzando STI.
Sono sicuro che questo dovrebbe essere abbastanza semplice, ma non so come farlo, in fondo mi piacerebbe creare il e assegnare il record in una sola operazione.
Soluzione
Questo farà quello che stai cercando.
def after_create
self.parent_in_use = ParentInUse.create!(parent_template.attributes)
end
Tuttavia, senza altri cambiamenti non farà nulla di buono. Perché la chiave esterna viene memorizzata nel modello attuale, ActiveRecord non salverà il cambiamento se questa associazione è stato creato da una chiamata after_create indietro. Il nuovo oggetto ParentInUse viene salvato, ma la riga database per il modello corrente non verrà aggiornato con quello corrispondente parent_in_use_id.
Lo chiami come una chiamata before_create indietro e le cose andranno più agevolmente.