J'utilise http://github.com/geekq/workflow pour fournir une machine d'état. J'utilise ActiveRecord pour enregistrer l'état, ce qui signifie que j'ai un attribut "workflow_state" dans le modèle. Je pense que je veux un named_scope pour chaque événement dans la machine d'état, donc je peux trouver tous les objets dans un état donné. Par exemple, en supposant une machine d'état très simple:Rails Workflow Gem - Métaprogrammation d'événements dans 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
Je veux named scopes pour chaque état. Cependant, ce n'est pas DRY ... Ce que je veux retrouver avec quelque chose comme:
named_scope :new, :conditions => ['workflow_state = ?', 'new']
named_scope :old, :conditions => ['workflow_state = ?', 'old']
named_scope :dead, :conditions => ['workflow_state = ?', 'dead']
Mais avec quelques lignes qui ne dépendent pas de la liste actuelle des Etats.
Je peux voir que le modèle # workflow_spec.states.keys me donne chaque état. Mais ce dont je pense avoir besoin est un wierd lambda où le nom de la portée est une variable. Et je n'ai aucune idée de comment faire ça. Du tout. J'ai commencé à regarder ça pendant des heures et à jouer avec irb, mais je pense qu'il y a une connaissance de la métaprogrammation que je n'ai pas. Aidez-moi, s'il vous plaît!
Lucas, ci-dessous, donne la réponse - mais nous devons aussi changer un symbole à une chaîne:
workflow_spec.states.keys.each do |state|
named_scope state, :conditions => ['workflow_state = ?', state.to_s]
end
tweak mineur et qui semble fonctionner. Et pas un lambda en vue: workflow_spec.states.keys.each faire | état | named_scope state,: conditions => ['workflow_state =?', État.to_s] fin Merci! – JezC