2010-02-03 17 views
5

Estoy usando http://github.com/geekq/workflow para proporcionar una máquina de estado. Estoy usando ActiveRecord para guardar el estado, lo que significa que tengo un atributo "workflow_state" en el modelo. Creo que quiero un named_scope para cada evento en la máquina de estado, por lo que puedo encontrar todos los objetos en un estado determinado. Por ejemplo, asumiendo una máquina de estado muy simple:Rails Workflow Gem - ¿Metaprogramación de eventos en 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 

Quiero ámbitos con nombre para cada estado. Sin embargo, eso no es SECO ... Lo que quiero es terminar con algo como:

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

Pero con unas líneas que no dependen de la lista actual de los estados.

puedo ver que el modelo # workflow_spec.states.keys me da cada estado. Pero lo que creo que necesito es un lambda extraño donde el nombre del alcance es una variable. Y no tengo ni idea de cómo hacer eso. En absoluto. He estado mirando esto durante horas y jugando con IRB, pero creo que hay un conocimiento sobre la metaprogramación que simplemente no tengo. ¡Ayuda por favor!

Lucas, a continuación, da la respuesta - pero también tenemos que cambiar un símbolo en una cadena:

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

Respuesta

3

intentar algo como esto en la parte superior de su cuerpo de la clase

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

pequeño ajuste y que parece funcionar. Y no un lambda a la vista: workflow_spec.states.keys.each hacer | estado | estado named_scope,: condiciones => [ 'workflow_state =?', State.to_s] final Gracias! – JezC

0

Scopes ahora son por defecto compatibles con la gema en sí. alcances Ahora se suma genera automáticamente con nombres basados ​​en los nombres de los estados:

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 

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