7

このクラスがあるとします (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

次に、 app/models/state_machines に次のような内容の job_state_machine.rb ファイルを作成しました。

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
4

1 に答える 1

8

これは簡単にできませんか?

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

    aasm do
      ...
    end
  end
end
于 2014-08-27T20:22:07.010 に答える