web-dev-qa-db-ja.com

Railsコールバックでのafter_create、after_saveおよびafter_commitの違い

after_createafter_save、およびafter_commitの違いは、Rails)です。

  • after_saveは、オブジェクトが作成および更新されるときに呼び出されます
  • after_commitは、作成、更新、および破棄時に呼び出されます。
  • after_createは、オブジェクトの作成時にのみ呼び出されます

これがそれらの間の唯一の違いですか、または他の大きな違いはありますか?

37
Haseeb Ahmad

あなたはほとんどそれを正しかった。ただし、after_commitafter_createまたはafter_saveには大きな違いが1つあります。

after_createの場合、これは常に保存(または作成)の呼び出しが戻る前になります。

Railsはトランザクション内のすべての保存をラップし、そのトランザクション内でbefore/after createコールバックを実行します(これにより、after_createで例外が発生した場合、保存がロールバックされます)。 after_commitを使用すると、コードは最も外側のトランザクションがコミットされるまで実行されません。これは、トランザクションRails createdまたはあなたが作成したものです(たとえば、1つのトランザクション内で複数の変更を行いたい場合)。最初に投稿された here

また、つまり、after_commitが例外を発生させた場合、トランザクションはロールバックされません。

53
Dusht

コールバックの順序付き

after_create-

Model.saveの後に、まだ保存されていない(レコードが存在しない)新しいオブジェクトで呼び出されます

after_save-

Model.saveの後に呼び出されます(作成または更新の保存に関係なく)

after_commit-

データベーストランザクションが完了した後に呼び出されます。

6
Arvind singh