- 開発
READ MORE
原著者の許諾を得て翻訳・公開いたします。
前回はActiveRecordのトランザクションの概要を学びました。今回はトランザクションのコールバックをもう少し詳しく見てみることにしましょう。
トランザクション内で使われるコールバックには2種類あります。
after_commit
コールバックは、レコードが保存または削除(destroy)されるたびに、トランザクションがデータベースにcommitされた後で呼び出されます。例を見てみましょう。
class User < ActiveRecord::Base
after_commit :log_user_activity
...
def log_user_activity
Rails.logger.info("ユーザー#{id}は更新されました")
end
end
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
知りたいことがありましたら、twitter または連絡用フォームにてお気軽にお問い合わせください。
もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。