5

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

2 回答 2

3

在班级主体的顶部尝试这样的事情

workflow_spec.states.keys.each do |state|
   named_scope state, :conditions => ['workflow_state = ?', state] 
end
于 2010-02-03T19:48:01.687 回答
0

现在,gem 本身默认支持范围。现在它添加了自动生成的范围,其名称基于状态名称:

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

来源:https ://github.com/geekq/workflow

于 2015-08-11T04:54:57.027 回答