Сейчас можно проверить был ли модифицирован объект (ActiveRecord) и что именно было модифицировано.
article = Article.find(:first)
article.changed? #=> false
Отслеживать изменение отдельных атрибутов:
# attr_name_changed? accessor
article.title
#=> "Заголовок"
article.title = "Новый заголовок"
article.title_changed?
#=> true
Получить старое значение атрибута:
# attr_name_was accessor
article.title_was
#=> "Заголовок"
Получить старое и новое значения:
# attr_name_change accessor
article.title_change
#=> ["Заголовок", "Новый заголовок"]
Получить массив измененных атрибутов:
article.changed #=> ['title']
Получить хэш изменений:
article.changes
#=> { 'title' => ["Заголовок", "Новый заголовок"] }
Вот как ведет себя объект:
article.changed?
#=> true
article.save
#=> true
article.changed?
#=> false
Однако если вы модифицируете значение атрибута вне attribute=(), вам придется предупредить об этом модель:
article = Article.find(:first)
article.title_will_change!
article.title.upcase!
article.title_change #=> ['Title', 'TITLE']