【Rails】モデルのアップデート時に変更されたカラムを取得する方法

Controllerのeditおよびupdateアクションなどでデータのアップデートを行った際、変更されたデータの取得がしたいこと、ありますよね。
というわけで取得法をメモっておきます。

環境

Rails 4.0
Ruby 2.1

変更関連のメソッド

Ruby On Rails ピチカート街道 - Rails 2.1・その5(model の値変更を覚えている) -
こちらの方が素晴らしく纏めてくださっているので、詳しくはそちらで確認して頂ければと思います。

今回使用していくのは

SomeModel.changes

というメソッドで、これは変更されたカラムのカラム名と前後のデータを配列で返してくれるものです。
返ってくる値はこんな感じ。

{"name"=>["hogehoge", "fugafuga"], "age"=>["17", "35"]", updated_at"=>[Mon, 11 Aug 2014 22:23:57 JST +09:00, Mon, 11 Aug 2014 22:27:29 JST +09:00]}

※配列はイメージです

以下で早速実装。

変更カラムの取得

  • SomeModel
class SomeModel < ActiveRecord::Base
  after_update :get_changes
  attr_accessor :change_cols

  private
  def get_changes
    @change_cols = self.changes
  end
end

after_updateにchangesを行うメソッドを設定し、その変更を格納するためのクラス変数を用意するだけです。非常に簡単!

あとはコントローラでUpdateを呼んであげれば、該当モデルのアクセッサで定義したクラス変数に変更されたカラムの情報が格納されます。

  • SomeController
class SomeController < ApplicationController
  def update
    @some_instance = SomeModel.find(some_id) 
    @some_instance.update!(some_params)
    # @some_instance.change_colsで変更カラムの配列にアクセス可能
  end


こんな感じで無事変更カラムの取得が出来ました。
あとはviewで使うなり、メールのメッセージに載せるなり、好きに利用すればよしです。