Rails Workflow 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

Мне нужны именованные области для каждого состояния. Однако это не СУХОЙ... В итоге я хочу получить что-то вроде:

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 дает мне каждое состояние. Но я думаю, что мне нужна странная лямбда, где имя области видимости является переменной. И я понятия не имею, как это сделать. Вообще. Я смотрел на это часами и играл с irb, но я думаю, что есть часть знаний о метапрограммировании, которых у меня просто нет. Помогите, пожалуйста!

Лукас ниже дает ответ, но нам также нужно изменить символ на строку:

  workflow_spec.states.keys.each do |state|
     named_scope state, :conditions => ['workflow_state = ?', state.to_s] 
  end

person JezC    schedule 03.02.2010    source источник


Ответы (2)


Попробуйте что-то подобное в верхней части тела вашего класса

workflow_spec.states.keys.each do |state|
   named_scope state, :conditions => ['workflow_state = ?', state] 
end
person Lucas    schedule 03.02.2010
comment
Небольшая настройка, и это, кажется, работает. И не лямбда в поле зрения: workflow_spec.states.keys.each do |state| состояние named_scope, :conditions =› ['workflow_state = ?', state.to_s] end Спасибо! - person JezC; 03.02.2010

Области теперь по умолчанию поддерживаются самим гемом. Теперь он добавляет автоматически сгенерированные области с именами, основанными на именах состояний:

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

person illusionist    schedule 11.08.2015