2014-11-06 6 views
2

Я понимаю, что, чтобы проверить, если модель изменилась можно использовать:РЕЛЬСЫ Проверьте, какой атрибут модели изменился

instance.changed? 

Кроме того, чтобы проверить, если атрибут изменился:

instance.attr_changed? 

но как мы можем определить, какой атрибут изменился? Есть ли способ, по которому мы можем перебирать все атрибуты один за другим и как-то определять, какой из них изменился?

ответ

3

Вы можете посмотреть на него довольно легко с помощью:

instance.changed_attributes 

или

instance.changed 

Сначала один даст вам хэш {"attribute" => "value before change"}.

Второй возвращает массив имен атрибутов, которые изменились: ["name of changed attribute"].

+0

hmm ... удивительно, пример.измененный? возвращает true, а instance.changed ничего не печатает. Есть идеи ? –

+0

Это довольно интересно. Может быть, вы используете некоторые драгоценные камни, которые перезаписывают некоторые из функций AR? Когда вы смотрите на документы: http://api.rubyonrails.org/classes/ActiveModel/Dirty.html#method-i-changed, вы можете увидеть реализацию 'changed':' changed_attributes.present? ',' Changed? ' : 'changed_attributes.keys' и' changed_attributes': '@changed_attributes || = ...'. Поэтому - на самом деле это невозможно ... УНИВЕРСАЛЬНО ** вы как-то меняете поведение AR. – Esse

+0

Да, действительно, это было отменено. Благодаря! –

Смежные вопросы