Направляющие: attribute_changed?

У меня есть модель, которая имеет 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
8
задан thenengah 1 June 2010 в 02:08
поделиться

3 ответа

Если вы хотите отслеживать изменения в вашей модели, 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, который извлекает значение amount до изменения.

Вы можете сохранить оба варианта во время вызова update_attributes. В противном случае, если вам не нужна история amount_was, вы можете просто использовать две переменные экземпляра.

Если вам нужно что-то большее, например, отслеживание истории модели, в Rails есть хороший специализированный плагин. Что касается других приятных тем, о которых говорил Райан Бейтс, я здесь: Railscasts #177

29
ответ дан 5 December 2019 в 05:18
поделиться

Используйте вызов *_was для получения старого значения:

p m.amount_was if m.amount_changed?
3
ответ дан 5 December 2019 в 05:18
поделиться

Вы можете создать в вашем модуле другой виртуальный атрибут

attr_accessor :initial_amount

и когда вы загружаете данные из DB, заполните initial_amount суммой

затем вы можете проверить

(initial_amount == amount ? true : false)

ура, sameera

0
ответ дан 5 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: