2010-02-03 15 views
5

Tôi đang sử dụng http://github.com/geekq/workflow để cung cấp máy trạng thái. Tôi đang sử dụng ActiveRecord để lưu trạng thái, có nghĩa là tôi có thuộc tính "workflow_state" trong mô hình. Tôi nghĩ rằng tôi muốn một named_scope cho mỗi sự kiện trong máy nhà nước, vì vậy tôi có thể tìm thấy tất cả các đối tượng trong một trạng thái nhất định. Ví dụ: giả sử một máy trạng thái rất đơn giản:Rails Workflow Gem - Các sự kiện lập trình meta thành 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 

Tôi muốn có phạm vi được đặt tên cho mỗi trạng thái. Tuy nhiên, đó không phải là DRY ... Những gì tôi muốn kết thúc với một cái gì đó như:

named_scope :new, :conditions => ['workflow_state = ?', 'new'] 
named_scope :old, :conditions => ['workflow_state = ?', 'old'] 
named_scope :dead, :conditions => ['workflow_state = ?', 'dead'] 

Nhưng với một vài dòng không phụ thuộc vào danh sách hiện tại của các tiểu bang.

Tôi có thể thấy rằng Model # workflow_spec.states.keys cung cấp cho tôi từng trạng thái. Nhưng những gì tôi nghĩ rằng tôi cần là một lambda khủng khiếp, nơi tên của phạm vi là một biến. Và tôi không có ý tưởng làm thế nào để làm điều đó. Ở tất cả. Đã nhìn chằm chằm vào điều này trong nhiều giờ và chơi với irb, nhưng tôi nghĩ rằng có một phần kiến ​​thức về lập trình meta mà tôi không có. Xin giúp tôi!

Lucas, dưới đây, cung cấp cho các câu trả lời - nhưng chúng ta cũng cần phải thay đổi một biểu tượng thành một chuỗi:

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

Trả lời

3

Hãy thử một cái gì đó như thế này trên đỉnh của cơ thể lớp học của bạn

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

tinh chỉnh nhỏ và điều đó dường như làm việc. Và không phải là một lambda trong tầm nhìn: workflow_spec.states.keys.each do | state | trạng thái named_scope,: conditions => ['workflow_state =?', State.to_s] kết thúc Cảm ơn! – JezC

0

Scopes bây giờ theo mặc định được hỗ trợ bởi chính gem. phạm vi bây giờ nó cho biết thêm tự động được tạo ra với tên dựa trên tên bang:

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 

Nguồn: https://github.com/geekq/workflow

Các vấn đề liên quan