A while ago I wrote a small post on how to manually mark an ActiveRecord model attribute as dirty. Since Rails 5.2 has some fundamental changes to ActiveRecord::Dirty.
Specifically, three methods have been deprecated and changed in 5.2. These are:
attribute_changed?
changes
, andprevious_changes
Using these methods in a Rails 5.2 application will now result in the following message (or a variation of it) being outputted in your logs:
DEPRECATION WARNING: The behavior of `attribute_changed?` inside of after callbacks will be changing in the next version of Rails. The new return value will reflect the behavior of calling the method after `save` returned (e.g. the opposite of what it returns now). To maintain the current behavior, use `saved_change_to_attribute?` instead.
attribute_changed?
and changed?
remain the same when called within a before_save
callback. But when used in an after callback there are new methods you should use instead, which the Rails Core Team believe should reduce code ambiguity of changed?
before saving to the database: will_save_change_to_attribute?
and has_changes_to_save?
In summary, if upgrading to Rails 5.2 and after modifying an object and after saving to the database, or within after_save
:
attribute_changed?
should now besaved_change_to_attribute?
changed?
should now besaved_changes?
changes
should now besaved_changes
previous_changes
has no replacement, since the behavior for it changes.
And (optional; less ambiguity, more readable, but longer) after modifying an object and before saving to the database, or within before_save
:
attribute_changed?
should now bewill_save_change_to_attribute?
changed?
should now behas_changes_to_save?
changes
should now bechanges_to_save