How to get the original value of an attribute in Rails
ActiveRecord's attributes_before_type_cast
method returns a hash of attributes before typecasting and deserialization have occurred.
For rails 5.1+
Appending _was
is deprecated in rails 5.1, now you should append _before_last_save
Something like:
before_save object
do_something_with object.name_before_last_save
end
Will return the name value before your last save at database (works for save and create)
The difference between _was
and _before_last_save
according to the documentation:
_was source from docs
def attribute_was(attr)
attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end
_before_last_save source from docs
def attribute_before_last_save(attr_name)
mutations_before_last_save.original_value(attr_name)
end
You can see a better example here
Before rails 5.1
Appending _was
to your attribute will give you the previous value.
For rails 5.1+
Copied from Lucas Andrade's answer below: https://stackoverflow.com/a/50973808/9359123
Appending _was
is deprecated in rails 5.1, now you should append _before_last_save
Something like:
before_save object
do_something_with object.name_before_last_save
end
Will return the name value before your last save at database (works for save and create)
The difference between _was
and _before_last_save
according to the documentation:
_was source from docs
def attribute_was(attr)
attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end
_before_last_save source from docs
def attribute_before_last_save(attr_name)
mutations_before_last_save.original_value(attr_name)
end