🪝

Model Callbacks

保存/削除前後に自動実行されるフック

Model CallbackはActiveRecordオブジェクトの作成、更新、削除等のライフサイクルイベントに合わせて自動実行されるメソッドです。

主要コールバック順序(create時):
1. before_validation
2. after_validation
3. before_save
4. before_create
5. after_create
6. after_save
7. after_commit(トランザクションコミット後)

class Post < ApplicationRecord
  before_save :normalize_title
  after_create :send_notification
  before_destroy :check_dependencies

  private

  def normalize_title
    self.title = title.strip.titleize
  end

  def send_notification
    NotificationJob.perform_later(self)
  end
end

注意: コールバックが多すぎるとコードの流れが把握しにくく、テストも複雑になります。複雑なビジネスロジックはService Objectに分離するのが良いです。

キーポイント

1

before_validation — 検証前データ正規化

2

after_validation — 検証後の追加処理

3

before_save / before_create / before_update — 保存前ロジック

4

after_save / after_create / after_update — 保存後ロジック

5

before_destroy / after_destroy — 削除前後ロジック

6

after_commit — トランザクション完了後(外部API呼び出し、Job実行に適合)

メリット

  • 反復コード削減(DRY)
  • データ一貫性保証
  • ライフサイクルイベントに自動対応
  • 宣言的で意図把握が容易

デメリット

  • 過度なコールバックはコード追跡が困難
  • コールバック順序依存が発生しうる
  • テスト時の意図しない副作用
  • Service Objectの方が適切な場合が多い

ユースケース

データ正規化(before_save) 通知送信(after_create) UUID自動生成(before_create) 監査ログ記録(after_save) 関連データ整理(before_destroy)