Quelle est la différence entre `after_create` et` after_save` et quand les utiliser?


124

Sont after_createet after_saveles mêmes que par fonctionnalité?

Je souhaite faire une opération avec l'email d'un utilisateur après la création de son compte.

Je veux faire cette opération lorsqu'elle est enregistrée dans la base de données.

quel est préférable d'utiliser: after_createou after_save?

Réponses:


212

after_create ne fonctionne qu'une seule fois - juste après la création de l'enregistrement.

after_save fonctionne à chaque fois que vous enregistrez l'objet, même si vous ne faites que le mettre à jour plusieurs années plus tard

Donc, si vous ne souhaitez effectuer cette opération de messagerie qu'une seule fois (et plus jamais), utilisez after_create.

Si vous voulez le faire à chaque fois que l'objet est enregistré, faites-le dansafter_save


2
les lecteurs doivent noter que, selon la documentation , ActiveRecord update_allafter_*
n'appelle

93

À partir de la documentation :

after_create()

Est appelé après Base.savesur les nouveaux objets qui n'ont pas encore été enregistrés (aucun enregistrement n'existe).

after_save()

Est appelé après Base.save (qu'il s'agisse d'une sauvegarde de création ou de mise à jour).


1
after_save()

Fonctionne très bien lorsque vous devez enregistrer des modèles qui ne sont pas enregistrés très souvent. Pour cet exemple particulier de modification fréquente des enregistrements, il serait conseillé d'utiliser

 after_commit()

assurez-vous que le modèle est enregistré dans la base de données avant l'exécution de l'action after_commit: Calculate_credit_score

def calculate_credit_score
     #Call a Cron job
end

Vous conseillez d'utiliser after_commitmais n'expliquez pas pourquoi. Pouvez-vous préciser? Notez que after_commits'exécute sur create, updat et destroy. Docs: apidock.com/rails/ActiveRecord/Transactions/ClassMethods / ... Donc ce n'est pas le même comportement que after_saveVous voulez vraiment appeler ce cron_job après avoir détruit l'enregistrement? Ou dans le cas des opérations, envoyer un e-mail à un utilisateur maintenant supprimé? Soyez prudent avec l'utilisationafter_commit
rmcsharry

after_commits'exécute sur ces opérations CRUD, donc si dans son cas l'e-mail est mis à jour souvent, alors il serait plus facile de combiner l'action pour un rappel spécifique. Dans mon cas, j'ai utiliséafter_commit : calculate_profile_update, on: :update
pensebien
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.