我正在使用http://github.com/geekq/workflow提供状态机。我正在使用ActiveRecord保存状态,这意味着我在模型中具有“workflow_state”属性。我想我想要状态机中每个事件的named_scope,因此我可以找到给定状态下的所有对象。例如,假设一个非常简单的状态机:
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
我想要每个状态的命名范围。但是,这不是DRY ...我想要的最终结果是:
named_scope :new, :conditions => ['workflow_state = ?', 'new']
named_scope :old, :conditions => ['workflow_state = ?', 'old']
named_scope :dead, :conditions => ['workflow_state = ?', 'dead']
但是有几行与当前状态列表无关。
我可以看到Model#workflow_spec.states.keys给了我每个状态。但是我想我需要的是一个奇怪的lambda,其中作用域的名称是一个变量。而且我不知道该怎么做。完全没有。盯着这个看了好几个小时,然后和irb一起玩,但是我认为我对元编程有一些了解。请帮助!
下面的卢卡斯给出了答案-但我们还需要将符号更改为字符串:
workflow_spec.states.keys.each do |state|
named_scope state, :conditions => ['workflow_state = ?', state.to_s]
end
最佳答案
在类里面尝试这样的事情
workflow_spec.states.keys.each do |state|
named_scope state, :conditions => ['workflow_state = ?', state]
end
关于ruby-on-rails - Rails Workflow Gem-将事件元编程到named_scopes吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2194840/