AASM: отделение определения конечного автомата от определения класса
Предположим, у меня есть этот класс (взят из документации AASM):
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
Мне не очень нравится тот факт, что мое определение конечного автомата смешано с определением моего класса (поскольку, конечно, в реальном проекте я добавлю больше методов в класс Job).
Я хотел бы отделить определение конечного автомата в модуле, чтобы класс Job мог быть чем-то вроде:
class Job < ActiveRecord::Base
include StateMachines::JobStateMachine
end
Затем я создал файл job_state_machine.rb в app / models / state_machines с содержимым, похожим на:
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
но это не работает, потому что AASM включается в модуль не в классе Job... Я даже попытался изменить модуль на:
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
но все же это не работает... любой намек или предложение очень ценится.
Спасибо, Игнацио
РЕДАКТИРОВАТЬ:
Благодаря Alto, правильное решение таково:
module StateMachine::JobStateMachine
def self.included(base)
base.send(:include, AASM)
base.send(:aasm, column: 'status') do
....
end
end
end
и, очевидно, не забудьте включить определение конечного автомата в основной класс следующим образом:
include StateMachine::JobStateMachine
1 ответ
Не могли бы вы просто сделать это?
module StateMachines::JobStateMachine
def self.included(base)
base.send(:include, AASM)
aasm do
...
end
end
end