最近、仕事上の Ruby プロジェクトで、"モデルに変更があった時だけそのモデルに対して update したい" みたいな要望があって、いろいろ調べたのですが、最終的に virtus-dirty_attribute というのを使うことになった。
virtus-dirty_attribute の使い方
https://github.com/ahawkins/virtus-dirty_attribute
README にも書いてあるけど、
class Hoge include Virtus.model include Virtus::DirtyAttribute
的な感じに include すると、hoge.dirty?
とか hoge.clean?
とかで変更があったかどうかが見れるという代物。
へー、便利だなー、でも Rails さんそこらへんやってくれないのかしら?と思っていたら、やっぱり一応あった。それが ActiveModel::Dirty。
ActiveModel::Dirty
http://api.rubyonrails.org/classes/ActiveModel/Dirty.html
なにやら define_attribute_methods とか定義したり、各 attribute のメソッドを定義して hogehoge_will_change とか呼んであげたりと、結構色々やってあげなきゃいけなそう。。。
ActiveRecord 使っているとそこら辺勝手にやってくれるらしく、ActiveRecord のモデルでやる文には便利そう。
というわけで
今回 "モデルに変更があった時だけそのモデルに対して update したい" ということがしたかったのは、たまたま ActiveRecord のモデルじゃなかったので、virtus-dirty_attribute で行くのが良さそう。