Тестирование attribute_changed?VS.previous_changes при проверке изменения определенного атрибута (Rails) ведет себя иначе - PullRequest
0 голосов
/ 26 мая 2018

Помимо типа возврата, указанного в документах, я проверял разницу между двумя следующими строками в двух разных методах в after_save:

[:attribute_1, :attribute_2].any? {|a| self.send("#{a}_changed?")}

[:attribute_1, :attribute_2].any? {|attribute| self.previous_changes.key? attribute.to_s}

model.save!вызывается несколько раз, но, к моему удивлению, первая строка вернула true, когда один из атрибутов был изменен, а вторая вернула false, а previous_changes - пустой хеш.Может кто-нибудь объяснить, почему это может произойти?

Rails Версия: '3.2.22.1'

1 Ответ

0 голосов
/ 26 мая 2018

Предыдущие изменения предварительно заполняются после сохранения модели (и after_save обратный вызов является частью этого процесса)

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

Согласно документации ActiveModel :: Dirty (в Rails 3 такое же поведение)

person = Person.new
person.name = 'Bob'
person.name_changed?  # => true
person.changes        # => {"name" => [nil, "Bill"]}
person.save

person.name_changed?     # => false
person.changes           # => {}
person.previous_changes  # => {"name" => [nil, "Bill"]}
person.reload!
person.previous_changes  # => {}

Но если вы попытаетесь проверить то же самое в обратном вызове after_commit, вы получите другие результаты, так как after_commit вызывается после сохранения модели.Таким образом, previous_changes будет предварительно заполнено, а changes будет пустым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...