प्रश्न यह है कि, राज्य मशीन हमेशा स्थाई रूप से परिभाषित (कक्षाओं पर) हैं? या मेरे पास ऐसा करने का कोई तरीका है, इसलिए कक्षा के प्रत्येक उदाहरण के साथ यह राज्यों का अपना सेट है?गतिशील राज्य मशीन? क्या राज्य मशीनों को कक्षाएं होनी चाहिए?
मैं कार्य इंजन को लागू करने के लिए Stonepath देख रहा हूं। मैं वास्तव में वहां "राज्यों" और "कार्यों" के बीच भेद नहीं देखता, इसलिए मुझे लगता है कि मैं सिर्फ एक राज्य को एक कार्य को मानचित्र बना सकता हूं। इस तरह काम करने के लिए बिना, मुझे काम सूचियों (या वर्कफ़्लो) गतिशील रूप से परिभाषित करने के लिए सक्षम होने के लिए अनुमति होगी: इसके बजाय
aasm_event :evaluate do
transitions :to => :in_evaluation, :from => :pending
end
aasm_event :accept do
transitions :to => :accepted, :from => :pending
end
aasm_event :reject do
transitions :to => :rejected, :from => :pending
end
, एक WorkItem (मुख्य कार्यप्रवाह/कार्य प्रबंधक मॉडल), बस कई होता कार्य। तब कार्यों राज्यों की तरह काम करेगा, तो मैं कुछ इस तरह कर सकता है:
aasm_initial_state :initial
tasks.each do |task|
aasm_state task.name.to_sym
end
previous_state = nil
tasks.each do |tasks|
aasm_event task.name.to_sym do
transitions :to => "#{task.name}_phase".to_sym, :from => previous_state ? "#{task.name}_phase" : "initial"
end
previous_state = state
end
हालांकि, मैं ऐसा नहीं कर सकते कि साथ aasm gem क्योंकि उन तरीकों (aasm_state
और aasm_event
) वर्ग के तरीकों, इसलिए के प्रत्येक उदाहरण हैं उस राज्य मशीन के साथ कक्षा में एक ही राज्य है। मुझे यह चाहिए कि "वर्कइटम" या "टास्कलिस्ट" द्विपक्षीय रूप से कार्यों के आधार पर राज्यों और संक्रमणों का अनुक्रम बनाता है।
यह मुझे वर्कफ़्लो को गतिशील रूप से परिभाषित करने की अनुमति देगा और केवल राज्यों को कार्यों के लिए नक्शा देगा।
क्या राज्य मशीनें कभी इस तरह उपयोग की जाती हैं? ऐसा लगता है कि यह ruby workflow gem जो मैं वर्णन कर रहा हूं उसके समान है।
अद्यतन: मैं निम्नलिखित की तरह कुछ कर रही देख सकते हैं, लेकिन यह एक तरह से hackish लगता है:
@implementation_state_machine = Class::new do
include AASM
aasm_initial_state :initial
tasks.each { |state| aasm_state :"#{task.name}"}
# ...
end
... जहाँ मेरे मॉडल पर एक संपत्ति implementation_state_machine
होगा। कार्यान्वयन अज्ञात वर्ग में राज्य से संबंधित विधियों (accepted_phase?
) को प्रतिनिधि देने के लिए मुझे method_missing
ओवरराइड करना होगा।