2010-05-31 7 views
8

Bir amount sahip bir model var ve bu miktar çalışıyor bir before_save ile Model.amount_changed? ile değiştirilir olup olmadığını görmek için izliyorum ama amount_was ve amount_change? görmek için kontrol yaparken sadece güncellenen Tutarı değil önceki miktarını döndürür . Ve tüm bunlar kurtarılmadan önce oluyor. Özelliğin ne zaman değiştirildiğini bilir, ancak eski değeri döndürmez.Raylar: attribute_changed?

Fikirler?

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

Model kodunu gönderebilir? – microspino

+0

İlgili bölüm – s84

cevap

29

Eğer modeli Raylar değişiklikleri takip etmek istiyorsanız "Dirty Objects" sağlar. E.g. Eğer veritabanı içinde eski değerini saklamak istiyorsanız

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

, şunları kullanabilirsiniz:

modeli amount
  • bağlıyor
    1. yöntem üzerinde _was Modeliniz bir name niteliği vardır öznitelikten önce: amount_was değiştirmeden önce miktar değerini al.

    Her ikisi de update_attributes araması sırasında kaydedebilirsiniz. Aksi takdirde, amount_was geçmişine ihtiyacınız yoksa, iki örnek değişkenini kullanabilirsiniz.

    Model geçmişinizi izlemek gibi daha fazla şeye ihtiyacınız varsa, Rails'in hoş bir eklentisi vardır. diğer güzel konulara gelince Ryan Bates konuşmak hakkında ben here: Railscasts #177

  • +0

    miktarını ekledim, öznitelik, _was daha önce değiştirilen değeri bulmak için yöntemdir. Aynı yöntem. Demiryollarını gördüm. – s84

    +0

    @ s84 - Raylarda 4 (3'ten emin değil), aşağıdakileri ÇALIŞTIRMAYIN: 'Person.first.city_id_was.state'. Bunun yerine, yapmanız gereken: 'City.find (Person.first.city_id_was) .state'. – onebree

    0
    Sen modülünde başka vertual niteliğini oluşturabilir

    attr_accessor:

    initial_amount ve DB'den veri yüklerken, miktarı ile initial_amount doldurmak kontrol edebileceğiniz ardından

    (initial_amount == miktarı gerçek: false)

    şerefe, sameera

    +0

    İlk değer nasıl alınır? – s84

    3

    Kullanım *_was çağrı eski değeri almak için:

    p m.amount_was if m.amount_changed?