I have a model that has an amount and I’m tracking to see if this amount is changed with a Model.amount_changed? with a before_save which works fine but when I check to see amount_was and amount_change? it only returns the updated amount not the previous amount. And all this is happening before it is save. It knows when the attribute is changed but it will not return the old value.
Ideas?
class Reservation < ActiveRecord::Base
before_save :status_amount, :if => :status_amount_changed
def status_amount_changed
if self.amount_changed? && !self.new_record?
true
else
false
end
end
def status_amount
title = "Changed Amount"
description = "to #{self.amount_was} changed to #{self.amount} units"
create_reservation_event(title, description)
end
def create_reservation_event(title, description)
Event.create(:reservation => self, :sharedorder => self.sharedorder, :title => title, :description => description, :retailer => self.retailer )
end
end
If you want to keep track of changes in your model Rails provides “Dirty Objects”.
E.g. Your model has a
nameattribute:If you want to store the old value inside your database, you can use:
amountamount_wasthat retrieve the value of amount before the change.You can save both during the
update_attributescall.Otherwise, if you don’t need the
amount_washistory, you can just use two instance variables.If you need somthing more, like tracking your model history, Rails has a nice dedicated plugin.
As for other nice topics Ryan Bates speak about I here: Railscasts #177