Tech Racho エンジニアの「?」を「!」に。
  • 開発

Rails tips: トランザクションでコールバックを使う(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

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』をどうぞお役立てください。

関連記事

Rails tips: ActiveRecordのトランザクションの概要(翻訳)

アトミックなトランザクションで冪等APIを強化する(翻訳)

Rails: :before_validationコールバックの逸脱した用法を改善する(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。