5

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 

Répondre

3

Essayez quelque chose comme ça sur le haut de votre corps de classe

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

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

0

Scopes sont maintenant pris en charge par défaut par la gemme elle-même. Maintenant, il ajoute automatiquement les étendues avec des noms générés en fonction des noms des états:

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 

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