Rails:attribute_changed?

时间:2010-05-31 07:54:51

标签: ruby-on-rails

我有一个amount的模型,我正在跟踪,看看这个金额是否已更改为Model.amount_changed?并且before_save工作正常,但当我查看时amount_wasamount_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

3 个答案:

答案 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"]

如果要将旧值存储在数据库中,可以使用:

  1. 模型属性amount
  2. 上述属性的方法 _was 换句话说:amount_was在更改之前检索金额的值。
  3. 您可以在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