2014-08-27 2 views
5

Предположим, у меня есть этот класс (взятый непосредственно из 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 

ответ

7

Не могли бы вы сделать это?

module StateMachines::JobStateMachine 
    def self.included(base) 
    base.send(:include, AASM) 

    aasm do 
     ... 
    end 
    end 
end 
+0

Благодарю вас, вы положили меня на правильный путь, я соответствующим образом изменю свой вопрос для тех, кто придет сюда в будущем – Gnagno

 Смежные вопросы

  • Нет связанных вопросов^_^