Rails - la sequenza di esecuzione di dopo la creazione di callback & attributi annidati
-
10-12-2019 - |
Domanda
Ho un semplice set up di User
e UserProfile
modello con Utente has_one :user_profile
e UserProfile belongs_to :user
.
Ma io sono in grado di avvolgere la mia testa intorno come Rails definisce l'ordine di esecuzione di after_create
richiamata e accepts_nested_attributes_for
definite nel modello.Consente di prendere in considerazione 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 posso creare un utente(con user_profile_attributes hash troppo) tramite la console, il after_create
callback viene generato dopo che l'utente e il suo profilo utente viene creato.
Caso 2:
Se il after_create
è posto in alto,
class User < ActiveRecord::Base
after_create :test_test
has_one :user_profile
accepts_nested_attributes_for :user_profile
end
la callback viene attivato dopo che un utente è stato creato, ma prima di creare un profilo utente.
È questo il modo in cui dovrebbe funzionare.Cosa Rotaie internamente qui?È la sequenza di esecuzione semplicemente determinato dall'ordine di codice?
Dove posso iniziare a scavare più in profondità o eseguire il debug ?
Soluzione
L'ordine delle dichiarazioni del modello, che può avere un impatto sul l'ordine di esecuzione del codice.Questa è una fonte di varie cose strane.(per esempio, attualmente richiamata definizioni e has_and_belongs_to_many associazioni sono dipendente: https://github.com/rails/rails/pull/8674 )
Per eseguire il debug del problema è necessario sfogliare le guide di origine.Dato che il tuo problema ha a che fare con l'ordine di esecuzione, di callback e attributi annidati mi piacerebbe iniziare a leggere su:
- https://github.com/rails/rails/blob/master/activerecord/lib/active_record/nested_attributes.rb#L256
- https://github.com/rails/rails/blob/master/activerecord/lib/active_record/callbacks.rb#L302
- https://github.com/rails/rails/blob/master/activemodel/lib/active_model/callbacks.rb#L98
Questo ti dà il background necessario per scavare più a fondo.Si noterà che accepts_nested_attributes_for
chiamate in add_autosave_association_callbacks
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/autosave_association.rb#L173
Questo metodo aggiunge un after_create
richiamata e per quanto ne so callback vengono eseguiti in ordine di definizione.