Reputation: 1105
I'm trying to get the old value in the before_save
by adding "_was" to my value but it doesn't seem to work.
Here is my code:
before_save :get_old_title
def get_old_title
puts "old value #{self.title_was} => #{self.title}"
end
Both "title_was" and "title" got the new title just been saved.
Is it possible to get the old value inside before_save
?
Upvotes: 21
Views: 19932
Reputation: 73
In rails 5.1.1 ActiveRecord::AttributeMethods::Dirty provides
saved_changes()
Link for saved_changes() which returns a hash containing all the changes that were just saved.
Upvotes: 1
Reputation: 2182
The reason for you getting the same value is most probably because you check the output when creating the record. The callback before_save
is called on both create()
and update()
but on create()
both title
and title_was
are assigned the same, initial value. So the answer is "yes, you can get the old value inside before_save
" but you have to remember that it will be different than the current value only if the record was actually changed. This means that the results you are getting are correct, because the change in question doesn't happen when the record is created.
Upvotes: 14
Reputation: 415
So, the answer above might work but what if I wanted to get the previous value for some reason and use it to perform some task then you would need to get the previous value. In my case I used this
after_update do
if self.quantity_changed?
sku.decrement(:remaining, (self.quantity_was - self.quantity) * sku.quantity)
end
end
The _was and _changed? added to any of the columns would do the job to get the job done.
Upvotes: 7