У меня есть модель, которая имеет amount
и я отслеживаю, чтобы видеть, изменяется ли эта сумма с a Model.amount_changed?
с a 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
Если вы хотите отслеживать изменения в вашей модели, 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
, который извлекает значение amount до изменения. Вы можете сохранить оба варианта во время вызова update_attributes
.
В противном случае, если вам не нужна история amount_was
, вы можете просто использовать две переменные экземпляра.
Если вам нужно что-то большее, например, отслеживание истории модели, в Rails есть хороший специализированный плагин. Что касается других приятных тем, о которых говорил Райан Бейтс, я здесь: Railscasts #177
Используйте вызов *_was
для получения старого значения:
p m.amount_was if m.amount_changed?
Вы можете создать в вашем модуле другой виртуальный атрибут
attr_accessor :initial_amount
и когда вы загружаете данные из DB, заполните initial_amount суммой
затем вы можете проверить
(initial_amount == amount ? true : false)
ура, sameera