5

나는 상태 기계를 제공하기 위해 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 

답변

3

이 클래스 본체의 상단에 이런 식으로 뭔가를 시도

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

마이너 팅겨 및 그 작동하는 것 같다. 그리고 광경에있는 람다가 아닙니다 : workflow_spec.states.keys.each do | state | named_scope 상태, : 조건 => [ 'workflow_state =?', state.to_s] 끝 감사! – JezC

0

스코프 이제는 보석 자체가 기본적으로 지원합니다. 국가의 이름에 따라 이름이 지금은 자동으로 생성 추가합니다 범위 :

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

관련 문제