5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ruby on Rails】Active Recordコールバックについて

Last updated at Posted at 2020-09-30

コールバックとは

Railsガイドより

コールバックとは、オブジェクトのライフサイクル期間における特定の瞬間に呼び出されるメソッドのことです。
コールバックを利用することで、Active Recordオブジェクトが作成/保存/更新/削除/検証/データベースからの読み込み、などのイベント発生時に常に実行されるコードを書くことができます。

Active Recordのコールバックは、ModelなどのActive Recordオブジェクトが更新されたり削除されたりして状態が変わるときに、その前後でイベントが発生する。
そのイベントで任意の処理を行うことができる。

コールバックの登録方法

例)会員データが削除された時にログを出力する。

app/models/member.rb
class Member < ApplicationRecord
  
  after_destroy do
    Rails.logger.info "Member is deleted: #{self.attributes}"
  end
end

Memberが削除された時にafter_destroy内の処理が、実行される。

種類

以下はActive Recordで利用可能なコールバック例。
before_はトリガーの前、around_はトリガーの前後、after_はトリガーの後の処理を定義できる。
before_validationなら、createとupdateで行われる検証処理の前に発生する。

コールバックポイント create update destroy
before_validation ×
after_validation ×
before_save ×
around_save ×
after_save ×
before_create × ×
around_create × ×
after_create × ×
before_update ×
around_update ×
after_update ×
before_destroy × ×
around_destroy × ×
after_destroy × ×

その他の使ってみた例

開発中に削除処理が失敗した時の挙動を確認したい場合があったので、以下のようにすると失敗させることができた。

app/models/member.rb
class Member < ApplicationRecord
  
  before_destroy { throw(:abort) }
end

throw(:abort)を書くことでコールバックの処理を意図的に停止させることができる。

コールバックで気をつけるべきこと

  • コールバックはmodelで設定されるので、controllerからロジックが見えず、開発者が予期しない処理が実行されることになりかねない。
  • コールバックを多用したり複雑な処理を行うとファットモデルになる。

参考

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?