Rails Workflow Gem - Метапрограммирование событий в named_scopes? - PullRequest
5 голосов
/ 03 февраля 2010

Я использую 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

Ответы [ 2 ]

3 голосов
/ 03 февраля 2010

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

workflow_spec.states.keys.each do |state|
   named_scope state, :conditions => ['workflow_state = ?', state] 
end
0 голосов
/ 11 августа 2015

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

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

...