我有一个amount
的模型,我正在跟踪,看看这个金额是否已更改为Model.amount_changed?
并且before_save
工作正常,但当我查看时amount_was
和amount_change?
它只返回更新的金额而不是之前的金额。所有这一切都在拯救之前发生。它知道属性何时被更改但它不会返回旧值。
想法?
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
答案 0 :(得分:29)
如果您想跟踪模型中的更改,Rails会提供"Dirty Objects"。
例如。您的模型具有name
属性:
my_model = MyModel.find(:first)
my_model.changed? # it returns false
# You can Track changes to attributes with my_model.name_changed? accessor
my_model.name # returns "Name"
my_model.name = "New Name"
my_model.name_changed? # returns true
# Access previous value with name_was accessor
my_model.name_was # "Name"
# You can also see both the previous and the current values, using name_change
my_model.name_change #=> ["Name", "New Name"]
如果要将旧值存储在数据库中,可以使用:
amount
amount_was
在更改之前检索金额的值。您可以在update_attributes
来电期间保存两者。
否则,如果您不需要amount_was
历史记录,则可以使用两个实例变量。
如果您需要更多内容,例如跟踪您的模型历史记录,Rails有一个很好的专用插件。 至于其他好话题,瑞安贝茨谈到我here: Railscasts #177
答案 1 :(得分:3)
使用*_was
调用获取旧值:
p m.amount_was if m.amount_changed?
答案 2 :(得分:0)
您可以在模块中创建另一个vertual属性
attr_accessor:initial_amount
当您从数据库加载数据时,请使用金额
填充initial_amount然后你可以检查
(initial_amount == amount?true:false)
欢呼声, sameera