supponiamo di avere questa classe (presa direttamente dalla documentazione SAMA):SAMA: Separare la definizione macchina a stati dalla definizione della classe
class Job < ActiveRecord::Base
include AASM
aasm do
state :sleeping, :initial => true
state :running
state :cleaning
event :run do
transitions :from => :sleeping, :to => :running
end
event :clean do
transitions :from => :running, :to => :cleaning
end
event :sleep do
transitions :from => [:running, :cleaning], :to => :sleeping
end
end
end
non mi piace molto il fatto che ho la mia macchina a stati definizione mescolata con la mia definizione di classe (poiché ovviamente in un progetto reale aggiungerò più metodi alla classe Job).
Vorrei separare la definizione macchina a stati in un modulo in modo che la classe di lavoro può essere qualcosa lungo la linea del:
class Job < ActiveRecord::Base
include StateMachines::JobStateMachine
end
Ho quindi creato un file job_state_machine.rb in app/models/state_machines con un contenuto simile a:
module StateMachines::JobStateMachine
include AASM
aasm do
state :sleeping, :initial => true
state :running
state :cleaning
event :run do
transitions :from => :sleeping, :to => :running
end
event :clean do
transitions :from => :running, :to => :cleaning
end
event :sleep do
transitions :from => [:running, :cleaning], :to => :sleeping
end
end
end
ma questo non sta funzionando perché SAMA è incluso nel modulo non nella classe di lavoro ... ho anche provato a cambiare il modulo a:
module StateMachines::JobStateMachine
def self.included(base)
include AASM
aasm do
state :sleeping, :initial => true
state :running
state :cleaning
event :run do
transitions :from => :sleeping, :to => :running
end
event :clean do
transitions :from => :running, :to => :cleaning
end
event :sleep do
transitions :from => [:running, :cleaning], :to => :sleeping
end
end
end
end
ma ancora non funziona ... qualsiasi suggerimento o suggerimento è molto apprezzato.
Grazie, Ignazio
EDIT:
Grazie Alto, la soluzione corretta è questa:
module StateMachine::JobStateMachine
def self.included(base)
base.send(:include, AASM)
base.send(:aasm, column: 'status') do
....
end
end
end
e ricordarsi di includere la definizione della macchina statale in, ovviamente, la classe principale come questa:
include StateMachine::JobStateMachine
Grazie mille, mi hai messo sulla giusta strada, modifico la mia domanda di conseguenza per chiunque verrà qui in futuro – Gnagno