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