2016-06-07 136 views
0

我试图在两种模式使用一个状态机,并让他们的模块不能包含state_machine模块

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宝石的最新版本

+0

你的意思是你想要2个模型共享相同的状态机*定义*,或共享相同的*定义和相同的状态*? –

+0

相同定义。 –

回答

1

状态机依赖于ActiveRecord模型,因此您需要使模块成为关注点。

module Schedulable 
    extend ActiveSupport::Concern 
    included do 
    state_machine :state, initial: :unscheduled 
    end 
end 
+0

这似乎工作谢谢! –

-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 

# 
+0

这并不符合我对模型的要求,因为模型的实例没有附带状态机。 –

+0

我假定state_machine方法对类执行操作(例如,将方法添加到该类)。这不正确吗?这就是'class << klass'所做的。 –

+0

StateMachineAdder.add在哪里被调用?在班级的任何地方? –