我正在使用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/

10-13 06:50