Controllerのeditおよびupdateアクションなどでデータのアップデートを行った際、変更されたデータの取得がしたいこと、ありますよね。
というわけで取得法をメモっておきます。
変更関連のメソッド群
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で使うなり、メールのメッセージに載せるなり、好きに利用すればよしです。