Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the original value of an attribute in Rails

is there a way to get the original value that an ActiveRecord attribute (=the value that was loaded from the database)?

I want something like this in an observer

before_save object   do_something_with object.original_name end 

The task is to remove the object from a hash table (in fact, move it to another key in the table) upon updating.

like image 748
Leonid Shevtsov Avatar asked Sep 28 '09 15:09

Leonid Shevtsov


1 Answers

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 
like image 183
Vincent Avatar answered Oct 14 '22 13:10

Vincent