나는 상태 기계를 제공하기 위해 http://github.com/geekq/workflow을 사용하고 있습니다. ActiveRecord를 사용하여 상태를 저장합니다. 즉, 모델에 "workflow_state"속성이 있음을 의미합니다. 상태 머신의 각 이벤트마다 named_scope을 원한다고 생각합니다. 따라서 주어진 상태의 모든 객체를 찾을 수 있습니다. 나는 각 상태에 대한 명명 된 범위를 원하는레일즈 워크 플로우 젬 - named_scopes로 이벤트를 메타 프로그래밍 하시겠습니까?
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']
그러나 국가의 현재 목록에 의존하지 않는 몇 줄의
.모델 # workflow_spec.states.keys가 각 상태를 제공하는 것을 볼 수 있습니다. 하지만 내가 필요로하는 것은 범위의 이름이 변수 인 이상한 람다 (wierd lambda)입니다. 그리고 어떻게해야할지 모르겠습니다. 조금도. 이걸 몇 시간 동안 쳐다 보면서 irb로 놀았지만, 내가 갖고 있지 않은 메타 프로그래밍에 대한 지식이 있다고 생각합니다. 도와주세요!
루카스는 아래의 답을 제공합니다 -하지만 우리는 또한 문자열로 기호를 변경해야
workflow_spec.states.keys.each do |state|
named_scope state, :conditions => ['workflow_state = ?', state.to_s]
end
마이너 팅겨 및 그 작동하는 것 같다. 그리고 광경에있는 람다가 아닙니다 : workflow_spec.states.keys.each do | state | named_scope 상태, : 조건 => [ 'workflow_state =?', state.to_s] 끝 감사! – JezC