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?

Swapnil Chincholkar
la source

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

Taryn Est
la source
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).

Michael Kohl
la source
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
pensebien
la source
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