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