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
Другие вопросы по тегам