Qual è la differenza tra `after_create` e` after_save` e quando usare quale?


124

Sono after_createe after_savela stessa come per la funzionalità?

Voglio fare un'operazione con l'e-mail di un utente dopo la sua creazione dell'account.

Voglio fare quell'operazione quando viene salvata nel database.

quale è preferibile usare: after_createo after_save?

Risposte:


212

after_create funziona solo una volta, subito dopo la creazione del record.

after_save funziona ogni volta che salvi l'oggetto, anche se lo stai aggiornando molti anni dopo

Quindi, se si desidera eseguire questa operazione e-mail solo una volta (e poi mai più), utilizzare after_create.

Se vuoi farlo ogni volta che l'oggetto viene salvato, allora falloafter_save


2
i lettori dovrebbero notare che, secondo i documenti , ActiveRecord's update_allnon invoca alcun callback, inclusoafter_*
user2426679

93

Dai documenti :

after_create()

Viene chiamato dopo Base.savesu nuovi oggetti che non sono stati ancora salvati (non esiste alcun record).

after_save()

Viene chiamato dopo Base.save (indipendentemente dal fatto che si tratti di creare o aggiornare un salvataggio).


1
after_save()

Funziona bene quando devi salvare modelli che non si salvano molto spesso. Per questo esempio particolare di modifica frequente dei record sarebbe consigliabile utilizzarlo

 after_commit()

assicurarsi che il modello sia salvato nel database prima che l'azione venga eseguita dopo_commissione: calcola_credito_sconto

def calculate_credit_score
     #Call a Cron job
end

Si consiglia di utilizzare after_commitma non spiegare perché. Per favore, puoi elaborare? Si noti che after_commitviene eseguito su Crea, Aggiorna e Distruggi. Documenti: apidock.com/rails/ActiveRecord/Transactions/ClassMethods/… Quindi non è lo stesso comportamento che after_savevuoi davvero chiamare dopo cron_job dopo aver distrutto il record? O, nel caso operativo, inviare un'email a un utente ora eliminato? after_commit
Fai

after_commitviene eseguito su tali operazioni CRUD, quindi se nel suo caso l'e-mail viene aggiornata spesso, sarebbe più semplice combinare l'azione per un callback specifico. Nel mio caso ho usatoafter_commit : calculate_profile_update, on: :update
pensebien il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.