¿Cuál es la diferencia entre `after_create` y` after_save` y cuándo usar cuál?

124

Son after_createy after_savelo mismo que por funcionalidad?

Quiero hacer una operación con el correo electrónico de un usuario después de la creación de su cuenta.

Quiero hacer esa operación cuando se guarda en la base de datos.

cuál es preferible usar: after_createo after_save?

Swapnil Chincholkar
fuente

Respuestas:

212

after_create solo funciona una vez, justo después de crear el registro por primera vez.

after_save funciona cada vez que guarda el objeto, incluso si lo está actualizando muchos años después

Entonces, si desea realizar esta operación de correo electrónico solo una vez (y luego nunca más), use after_create.

Si desea hacerlo cada vez que se guarda el objeto, hágalo enafter_save

Taryn East
fuente
2
los lectores deben tener en cuenta que, de acuerdo con los documentos , ActiveRecord de update_allno hace invoca ninguna de las devoluciones de llamada, incluyendoafter_*
user2426679
93

De los documentos :

after_create()

Se invoca después Base.saveen nuevos objetos que aún no se han guardado (no existe ningún registro).

after_save()

Se llama después Base.save (independientemente de si se trata de crear o actualizar guardar).

Michael Kohl
fuente
1
after_save()

Funciona bien cuando tiene que guardar modelos que no se guardan con mucha frecuencia. Para este ejemplo particular de cambio frecuente de registros, sería aconsejable utilizar

 after_commit()

asegúrese de que el modelo se guarde en la base de datos antes de ejecutar la acción after_commit: Calculate_credit_score

def calculate_credit_score
     #Call a Cron job
end
Pensebien
fuente
Aconseja usar, after_commitpero no explique por qué. Por favor, ¿puedes dar más detalles? Tenga en cuenta que se after_commitejecuta en crear, actualizar y destruir. Documentos: apidock.com/rails/ActiveRecord/Transactions/ClassMethods/… Entonces, ¿no es el mismo comportamiento que after_saverealmente quieres llamar a ese cron_job después de destruir el registro? ¿O en el caso de operaciones, enviar un correo electrónico a un usuario ahora eliminado? Tenga cuidado con el usoafter_commit
rmcsharry 01 de
after_commitse ejecuta en esas operaciones CRUD, por lo que si en su caso el correo electrónico se actualiza con frecuencia, sería más fácil combinar la acción para una devolución de llamada específica. En mi caso solíaafter_commit : calculate_profile_update, on: :update
pensebien