2009-03-25 16 views
7

Nesnenin durumunu veritabanında aasm kullanarak bir geçişte sürdürmenin en iyi yolu nedir? Bunun otomatik olarak gerçekleşeceğini düşündüm ama bu durum böyle görünmüyor.Rubyist-aasm kullanarak geçişte durum sütununda ısrar etmek (durum makinesi olarak işlev görür)

(Düzenleme: elle nesneyi kaydederken, devlet sütun güncellenmiş olsun demek Ama bir tasarruf geçişlerinde yapılmaz..)

Ben eğer öyleyse, bu eklenti için çok yararlı belgeler bulamıyorum Daha iyi belgelere sahip alternatif bir sonlu durum makinesi uygulaması için bir öneriniz var, bu da işe yarayabilir.

cevap

14

bang! Geçiş olay yönteminin formu, devlet devam edecektir.

closed devleti kuracak book.close çağrılması
class Book < ActiveRecord::Base 
    # ... 

    aasm_event :close do 
    transitions :to => :closed, :from => [:opened] 
    end 

    # ... 
end 

, ancak otomatik olarak tasarruf olmaz: Örneğin, aşağıdaki olayla bir nesne olduğunu varsayalım. book.close! numaralı telefonu arayarak durumu * ve * otomatik olarak AR nesnesini kaydedecektir.

-3

İstediğiniz etkiyi, geçişe kaydetmeniz gerektiğini düşünüyorum. ActiveRecord (hangi aasm üstünde oturuyor), kayıtlara, tasarım gereği otomatik kaydetmez.

İsterseniz, kaydetmeyi callback'dan yapabilirsiniz (ve yaptığınız gibi geliyor).

+0

Teşekkür ederim, ihtiyacım olan buydu. Bazı günlerde 'geri arama' gibi süslü kelimeleri düşünemiyorum;) – Angela

+2

Bu gereksizdir. Tüm olay geçişleri, kaydı otomatik olarak durduracak bir patlama yöntemine sahiptir. Daha fazla bilgi için cevabımı görün. –

0

AASM'ın geçişten sonra nesnenin durumunu sürdüreceğine inanıyorum. Aasm/lib/persistence/active_record_persistence.rb adresindeki satır 180-189'a bakın.

4

Colin önerdiği gibi, AASM değişikliklerinizi sizin için devam ettirecektir. Markus'ın söylediği şey, geminin son versiyonunun bir hataya sahip olması dışında, yanlış anlaşılmasıdır.

lib/kalıcılık/active_record_persistence.rb hattı 180 günü

(eğer mücevher çalıştırarak bu alabilirsiniz: açmak):

devlet kolona durumunu yazar ve devam, sen devletler yorumunu, görmelisiniz veritabanı için o

Ancak (doğrulama atlar) update_attribute kullanarak kodunda, aslında bunun yerine tasarruf çağrısı! altta yatan bir model doğrulama başarısız olduğunda yöntem varsayılan olarak baypas doğrulama yapmaz kaydetmek çünkü

unless self.save 

böcek, ortaya çıkar. Hızlı bir düzeltme yerine bunu yapmak olacaktır:

unless self.save(false) 

Şimdi, geçişler gerçekten veritabanına yeni devleti kaydederim.