代码之家  ›  专栏  ›  技术社区  ›  Sam å±±

Rails:属性\已更改?

  •  8
  • Sam å±±  · 技术社区  · 14 年前

    我有一个模型 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
    
    3 回复  |  直到 13 年前
        1
  •  29
  •   microspino    13 年前

    如果要跟踪模型中的更改,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. 方法 换句话说,在上述属性上: amount_was 检索的值 数量 在改变之前。

    您可以在 update_attributes 打电话。 否则,如果您不需要 金额为 历史记录,您只能使用两个实例变量。

    如果您需要更多的东西,比如跟踪您的模型历史,Rails有一个很好的专用插件。 至于其他不错的话题,瑞安·贝茨谈到我 here: Railscasts #177

        2
  •  3
  •   Harish Shetty    14 年前

    使用 *_was 调用以获取旧值:

    p m.amount_was if m.amount_changed?
    
        3
  •  0
  •   sameera207    14 年前

    您可以在模块中创建另一个Vertual属性

    attr_accessor:初始金额

    当您从数据库加载数据时,用金额填充初始金额

    然后你可以查一下

    (初始金额=金额?真:假

    干杯, 萨梅拉