La différence entre after_create
, after_save
et after_commit
in Rails est que:
after_save
est invoqué lorsqu'un objet est créé et mis à jourafter_commit
est appelé à créer, mettre à jour et détruire.after_create
n'est appelé que lors de la création d'un objetEst-ce la seule différence entre ceux-ci ou y a-t-il d'autres différences majeures?
Vous avez presque raison. Cependant, il existe une différence majeure entre after_commit
et after_create
ou after_save
c'est à dire.
Dans le cas de after_create
, ce sera toujours avant que l'appel à enregistrer (ou créer) ne revienne.
Rails encapsule chaque sauvegarde dans une transaction et les rappels de création avant/après s'exécutent à l'intérieur de cette transaction (une conséquence de cela est que si une exception est levée dans un after_create, la sauvegarde sera annulée). Avec after_commit
, votre code ne s'exécute qu'après la validation de la transaction la plus externe. Cela pourrait être la transaction Rails créé ou créé par vous (par exemple si vous vouliez apporter plusieurs modifications à l'intérieur d'une seule transaction). Initialement publié ici
Cela signifie également que si after_commit
lève une exception, la transaction ne sera pas annulée.
Avec ordre de rappel
after_create -
Est appelé après Model.save sur les nouveaux objets qui n'ont pas encore été enregistrés (aucun enregistrement n'existe)
after_save -
Est appelé après Model.save (qu'il s'agisse d'une sauvegarde de création ou de mise à jour)
after_commit -
Est appelé une fois la transaction de base de données terminée.