概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Transactions in Ruby on Rails application - learn how to use callbacks
 - 原文公開日: 2018/01/30
 - 著者: Paweł Dąbrowsk
 
Rails tips: トランザクションでコールバックを使う(翻訳)
前回はActiveRecordのトランザクションの概要を学びました。今回はトランザクションのコールバックをもう少し詳しく見てみることにしましょう。
トランザクション内で使われるコールバックには2種類あります。
1. commit後のコールバック
after_commitコールバックは、レコードが保存または削除(destroy)されるたびに、トランザクションがデータベースにcommitされた後で呼び出されます。例を見てみましょう。
class User < ActiveRecord::Base
  after_commit :log_user_activity
  ...
  def log_user_activity
    Rails.logger.info("ユーザー#{id}は更新されました")
  end
end
2. ロールバック後のコールバック
after_rollbackコールバックは、レコードが保存または削除(destroy)されるたびに、トランザクションがロールバックした後で呼び出されます。例を見てみましょう。このロールバックは、トランザクションが失敗した理由をログ出力したい場合にとても便利です。いくつかの属性をログ出力しておいて、後で原因をチェックすればよいのです。
class User < ActiveRecord::Base
  after_rollback :log_transaction_status
  ...
  def log_transaction_status
    Rails.logger.info("ユーザー#{id}は操作を実行できませんでした")
  end
end
トリガーを追加する
どちらのコールバックもレコードが保存または削除(destroy)されるたびに追加されると申し上げましたが、その気になればafter_commitコールバックに他のトリガーを加えることもできます。更新時/作成時/削除時に特定のメソッドをトリガーしたい場合は次のようにします。
after_commit :log_user_activity, on: :create
after_commit :log_user_activity, on: :update
after_commit :log_user_activity, on: :destroy
上の呼び出しでは次のようにエイリアスを使うこともできます。
after_create_commit :log_user_activity
after_update_commit :log_user_activity
after_destroy_commit :log_user_activity
Railsでお困りの方にお知らせ
知りたいことがありましたら、twitter または連絡用フォームにてお気軽にお問い合わせください。
RSpec & TDDの電子書籍を無料でダウンロード
もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。