1

我正在编写我的第一个 Rails gem,它向 ActiveRecord 添加了一个方法。我似乎无法找到一种简单的方法来从我添加到 ActiveRecord 的方法中调用其他方法。我应该使用这个模式吗?

module MyModule

  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods

    def my_class_method
      # This doesn't work
      some_utility_method
    end

  end

  def some_utility_method
    # Do something useful
  end

end

ActiveRecord::Base.send(:include, MyModule)
4

1 回答 1

3

一旦你已经包含了MyModuleActiveRecord::Base就会有my_class_method一个方法(相当于一个Class对象的实例方法ActiveRecord::Base)和some_utility_method一个实例方法。

my_class_method因此,insideselfClass ActiveRecord::Base,而不是该类的实例;它没有some_utility_method作为可用的方法

编辑: 如果你想要一个模块私有的实用程序方法,你可以这样做:

module MyModule

  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods

    def my_class_method
      # This doesn't work
      MyModule::some_utility_method
    end

  end

  def self.some_utility_method
    # Do something useful
  end

end

ActiveRecord::Base.send(:include, MyModule)
于 2012-04-18T19:30:19.077 回答