2014-08-27 9 views
5

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 

risposta

7

Non potresti farlo facilmente?

+0

Grazie mille, mi hai messo sulla giusta strada, modifico la mia domanda di conseguenza per chiunque verrà qui in futuro – Gnagno

Problemi correlati