我正在尝试在两个模型中使用一个状态机并让它们在模块中共享
module Schedulable
state_machine :state, initial: :unscheduled
end
class Install < ActiveRecord::Base
include Schedulable
end
我收到以下错误
NameError: undefined local variable or method `state_machine' for Schedulable:Module
如何从模块中正确包含状态机?我正在使用最新版本的state_machines
gem
答案 0 :(得分:1)
状态机依赖于ActiveRecord模型,因此您需要制作类似关注的模块。
module Schedulable
extend ActiveSupport::Concern
included do
state_machine :state, initial: :unscheduled
end
end
答案 1 :(得分:-2)
下面是一个类,它说明了如何通过调用该类之外的方法向类添加行为。您需要将方法定义替换为具有状态机代码的方法定义。
#!/usr/bin/env ruby
module ModifyClass
def self.add_foo_class_method(klass)
class << klass
def foo
puts 'I am foo.'
end
end
end
end
class C
ModifyClass.add_foo_class_method(self)
end
C.foo # => "I am foo."
要将此更多地转换为您的上下文,我认为它看起来像这样:
module StateMachineAdder
def self.add(klass)
class << klass
# state_machine ...
end
end
end
class MyModel_1
StateMachineAdder.add(self)
end
class MyModel_2
StateMachineAdder.add(self)
end
或者,您可以在一个类中定义常见行为(例如在类定义中对state_machine的调用,以及两个模型中包含相同或大部分相同行为的方法),然后将您的2个模型子类化为该类。这可能是最简单的解决方案。例如:
class XyzModelBase
state_machine ...
# Any methods common to both base classes can go here
def foo
# ...
end
end
class XyzModelFoo < XyzModelBase
# ...
end
class XyzModelBar < XyzModelBase
# ...
end
#