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