2010-02-03 16 views
5

Sto usando http://github.com/geekq/workflow per fornire una macchina a stati. Sto usando ActiveRecord per salvare lo stato, il che significa che ho un attributo "workflow_state" nel modello. Penso che voglio un named_scope per ogni evento nella macchina a stati, quindi posso trovare tutti gli oggetti in un determinato stato. Ad esempio, supponendo una macchina a stati molto semplice:Rails Workflow Gem - Metaprogramming eventi in named_scopes?

workflow do 
    state :new do 
    event :time_passes, :transitions_to => :old 
    end 
    state :old do 
    event :death_arrives, :transitions_to => :dead 
    end 
    state :dead 
end 

Voglio gli ambiti nominati per ciascuno stato. Tuttavia, questo non è SECCO ... Quello che voglio è finire con qualcosa di simile:

named_scope :new, :conditions => ['workflow_state = ?', 'new'] 
named_scope :old, :conditions => ['workflow_state = ?', 'old'] 
named_scope :dead, :conditions => ['workflow_state = ?', 'dead'] 

Ma con poche righe che non dipendono l'attuale elenco di stati.

Posso vedere che Model # workflow_spec.states.keys mi fornisce ogni stato. Ma quello che penso di cui ho bisogno è un Weldd Lambda in cui il nome dello scope è una variabile. E non ho idea di come farlo. Affatto. Sono stato a fissarlo per ore e a giocare con irb, ma penso che ci sia una conoscenza della metaprogrammazione che non ho. Aiuto per favore!

Lucas, al di sotto, dà la risposta - ma abbiamo anche bisogno di cambiare un simbolo in una stringa:

workflow_spec.states.keys.each do |state| 
    named_scope state, :conditions => ['workflow_state = ?', state.to_s] 
    end 

risposta

3

provare qualcosa di simile sulla parte superiore del vostro corpo della classe

workflow_spec.states.keys.each do |state| 
    named_scope state, :conditions => ['workflow_state = ?', state] 
end 
+0

Tweak Minore e che sembra funzionare. E non una lambda in vista: workflow_spec.states.keys.each do | state | stato named_scope,: condizioni => ['workflow_state =?', State.to_s] fine Grazie! – JezC

0

Scopes sono ora di default supportati dalla gemma stessa. Ora ambiti aggiunge generata automaticamente con i nomi in base ai nomi degli stati:

class Order < ActiveRecord::Base 
    include Workflow 
    workflow do 
    state :approved 
    state :pending 
    state :clear 
    end 
end 

# returns all orders with `approved` state 
Order.with_approved_state 

# returns all orders with `pending` state 
Order.with_pending_state 

# returns all orders with `clear` state 
Order.with_clear_state 

Fonte: https://github.com/geekq/workflow