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