ワシはワシが育てる

週刊少年ジャンプと任天堂のゲームが三度のメシより好きです。

Railsのafter_commitでcreateやupdateなどを判別する

上の記事でも触れていたことですが、after_commit時のレコードからcreate,update,destroyなどのアクションを判別する正規の方法を見つけたので書きます。

以前の記事を書いた時にstackoverflowなどを調べて良さ気だったのが「transaction_include_action(:action)」というメソッドだったのですが、こちらのAPI dockを見ての通りRails4.0以降では廃止になっています。

ならRails4.0以降ではどうなるんだろうと思って、API dockの右下を見ると代替メソッドっぽい「transaction_include_any_action(:actions)」というのが見つかります。

メソッド名からも連想できるように後者は複数のアクションを判別できるようになっており、パワーアップ(?)しているようです。

ということでcreated_atとupdated_atを比較するというような原始的な方法は捨てて、「transaction_include_any_action?」を使って判別すればいいだけということですね。

例えばobserverを使って判別する場合は以下のようになります。

class HogeObserver < ActiveRecord::Observer
  def after_commit(record)
    if record.send(:transaction_include_any_action?, [:create])
      # create時のアクション
    elsif record.send(:transaction_include_any_action?, [:update])
      # update時のアクション
    end
  end
end

後から気付いたのですが「activerecord-committed_observer」というライブラリでも同じ実装方法だったので、今度こそこれが正解だと思います。