Предыдущие изменения предварительно заполняются после сохранения модели (и 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
будет пустым.