2012-03-09 7 views
12

Ho una semplice configurazione del modello User e UserProfile con Utente has_one :user_profile e UserProfile belongs_to :user.Rails: sequenza di esecuzione dopo la creazione di callback e attributi nidificati

Ma non riesco a capire come Rails definisce l'ordine di esecuzione della chiamata after_create e accepts_nested_attributes_for definito nel mio modello. Consideriamo questi due casi.

Caso 1:

class User < ActiveRecord::Base 
    has_one :user_profile 
    accepts_nested_attributes_for :user_profile 
    after_create :test_test 
end 

Ora, se creo un utente (con user_profile_attributes hash anche) tramite la console, il after_create richiamata viene attivato dopo che l'utente e viene creato il suo profilo utente.

Caso 2: Se il after_create è posta in alto,

class User < ActiveRecord::Base 
    after_create :test_test 
    has_one :user_profile 
    accepts_nested_attributes_for :user_profile 
end 

la richiamata viene attivato dopo che un utente è stato creato, ma prima di creare un profilo utente.

È questo il modo in cui è previsto che funzioni. Cosa fa Rails internamente qui? La sequenza di esecuzione è determinata semplicemente dall'ordine del codice?

Dove posso iniziare a scavare più in profondità o eseguire il debug di questo?

+1

Vorrei testarlo nuovamente, l'ordine del codice sotto forma di callback non ha nulla a che fare con l'ordine di esecuzione .. – Rabbott

+0

@Rabbott - Apprezzo! – prasvin

+0

L'uso di 'inverse_of' potrebbe essere utile per risolvere dipendenze e problemi di salvataggio su create o on save. per esempio. 'has_one: user_profile, inverse_of:: user' – ybart

risposta

10

L'ordine delle dichiarazioni nel modello può avere un impatto sull'ordine di esecuzione del codice. Questa è una fonte per varie cose strane. (ad esempio, le definizioni di callback e has_and_belongs_to_many associazioni dipendono dall'ordine: https://github.com/rails/rails/pull/8674)

Per eseguire il debug del problema è necessario sfogliare la fonte dei binari. Dal momento che il problema ha a che fare con l'ordine di esecuzione, callback e gli attributi nidificati Vorrei iniziare a leggere su:

Questo ti dà il background necessario per scava più a fondo. Noterai che accepts_nested_attributes_for chiama add_autosave_association_callbackshttps://github.com/rails/rails/blob/master/activerecord/lib/active_record/autosave_association.rb#L173 Questo metodo aggiunge un callback after_create e per quanto ne so i callback vengono eseguiti in ordine di definizione.

+2

Grazie. Questo era esattamente ciò che stavo incontrando. Il mio modello ha avuto callbacks after_create in esecuzione e sono stati posizionati PRIMA delle definizioni has_many. Nel after_create stavo aggiornando un attributo con update_attribute (in alcuni casi) che stava facendo fallire l'aggiornamento del resto della catena has_many, il che significava che il mio has_many: attraverso le relazioni NON stava salvando di sorta. Spostare il after_create DOPO che le definizioni delle mie relazioni hanno risolto il problema. Pazzo. Grazie!!! –

+0

Il problema (non così oscuro?) Discusso in questo post è una cosa.Sono stato morso da esso, e ho risolto il problema spostando la definizione di callback "after_update" sotto le has_many e accept_nested_attributes_for definizioni, nel mio modello - come descritto sopra. –

+0

@DonnFelker yes, spostando il mio 'after_create' sotto il mio' accept_nested_attributes' lo ha risolto anche per me, grazie. – eggie5

Problemi correlati