web-dev-qa-db-fra.com

Différence entre after_create, after_save et after_commit dans Rails callbacks

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 à jour
  • after_commit est appelé à créer, mettre à jour et détruire.
  • after_create n'est appelé que lors de la création d'un objet

Est-ce la seule différence entre ceux-ci ou y a-t-il d'autres différences majeures?

37
Haseeb Ahmad

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.

53
Dusht

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.

6
Arvind singh