よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

after_updateなどのActiveRecordのCallbackを実行しないようにする方法

Objectの追加/削除/変更時に、after_createやafter_updateのようなcallbackが実行されないようにしたい場合があります。
簡単にcallbackが実行されないようにできないかを調べてみると、各Railsのバージョンで変化はしているものの、どのバージョンでも簡単にcallbackを回避する方法がありました。

Rails2系の場合(rails 2.3.12で確認)

foo = Foo.new
foo.title = "HogeHoge"
foo.send(:update_without_callbacks)

Rails3.0系の場合(rails 3.0.11で確認)

Foo.reset_callbacks :save
foo = Foo.new
foo.title = "HogeHoge"
foo.save

Rails3.1系の場合

update_columnメソッドを使うと良いみたいです。
APIを見ると以下のような解説がありました。

  • Validation is skipped.
  • Callbacks are skipped.
  • updated_at/updated_on column is not updated if that column is available.


ちなみにこちらを見ると他にも様々なやり方があるようです。