2011-11-20 20 views
10

Rails 3.1 uygulamasından birinde ActiveRecord ile state_machine kullanıyorum. Farklı eyaletlerle kayıtlara hantal olmak için sözdizimi buldum. Kapsam tanımlarını elle yazmadan, her bir durumun kapsamı aynı anda tanımlamak mümkün müdür?Durum_machine durumları için adlandırılmış kapsamlar

Örneğin aşağıdaki düşünün:

class User < ActiveRecord:Base 
    state_machine :status, :initial => :foo do 
    state :foo 
    state :bar 

    # ... 
    end 
end 

# state_machine syntax: 
User.with_status :foo 
User.with_status :bar 

# desired syntax: 
User.foo 
User.bar 

cevap

2
Ben de bu işlevi gerekli

ancak state_machine benzer ilgisi yoktur. Bu gist'u bulmamıza rağmen, aasm bu durumda daha iyi bir durum makinesi alternatifi gibi görünüyor. Benim modellerine aşağıdaki ekliyorum

+0

Teşekkürler, bu gerçekten yararlı bir özelliktir. Durumumda bu sorun dışında durumumda state_machine' gem'in daha iyi olduğunu buldum. – Andrew

16

:

siz bu sayarsanız
state_machine.states.map do |state| 
    scope state.name, :conditions => { :state => state.name.to_s } 
end 

emin değil "elle kapsam tanımları yazma?"

class Vehicle < ActiveRecord::Base 
    named_scope :with_states, lambda {|*states| {:conditions => {:state => states}}} 
    # with_states also aliased to with_state 

    named_scope :without_states, lambda {|*states| {:conditions => ['state NOT IN (?)', states]}} 
    # without_states also aliased to without_state 
end 

# to use this: 
Vehicle.with_state(:parked) 

Ben devlet adı ile çakışma olmayacak çünkü bu kullanmak ister: state_machine tanımlarken

+0

Lütfen bu kodun state_machine bloğundan sonra eklenmesi gerektiğini unutmayın. – tomaszbak

8

Her ihtimale aşağıdaki birileri hala bu arıyorsa, orada yöntemler eklendi. Daha fazla bilgiyi state_machine's ActiveRecord integration page adresinde bulabilirsiniz. Sana modeli çok birden state_machines varsa kullanılabilecek bir yol gösterecektir

scope :cancelled, lambda { with_state([:cancelled_by_user, :cancelled_by_staff]) } 
+0

OP zaten bunu biliyor. “Vehicle.with_state (: park edilmiş)” yerine farklı adlandırılmış kapsamlar oluşturup oluşturmayacağını soruyor: “Araç.parked”. Bonus için –

+0

thnx)) thats it! – cubbiu

+0

Rails 3'te, named_scope'un kapsam olarak yeniden adlandırıldığını unutmayın. – cubbiu

0

:

Bonus ben genellikle böyle bir şey yapmak, böylece dizi geçmesine izin vermesidir.

Durumunuz tam sayı olduğunda bile çalışır.

def Yourmodel.generate_scopes_for_state_machines state_machines.each_pair do |machine_name, that_machine| 
    that_machine.states.map do |state| 
     # puts "will create these scopes: #{machine_name}_#{state.name} state: #{state.value} " 
     # puts "will create these scopes: #{machine_name}_#{state.name} state: #{state.name.to_s} " 
     # Price.scope "#{machine_name}_#{state.name}", :conditions => { machine_name => state.name.to_s } 
     Price.scope "#{machine_name}_#{state.name}", :conditions => { machine_name => state.value } 
    end end end 

Yourmodel.generate_scopes_for_state_machines 
İlgili konular