小编Jez*_*ezC的帖子

Rails工作流程Gem - 将事件编程到named_scopes?

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我想要每个州的命名范围.然而,这不是干......我最终想要的是:

named_scope :new, :conditions => ['workflow_state = ?', 'new']
named_scope :old, :conditions => ['workflow_state = ?', 'old']
named_scope :dead, :conditions => ['workflow_state = ?', 'dead']
Run Code Online (Sandbox Code Playgroud)

但有几行不依赖于当前的州列表.

我可以看到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
Run Code Online (Sandbox Code Playgroud)

workflow lambda named-scope metaprogramming ruby-on-rails

5
推荐指数
1
解决办法
4022
查看次数