我正在使用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,但我认为有一些关于元编程的知识我只是没有。请帮忙!
下面的 Lucas 给出了答案——但我们还需要将符号更改为字符串:
workflow_spec.states.keys.each do |state|
named_scope state, :conditions => ['workflow_state = ?', state.to_s]
end