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
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