1

我想用实例方法扩展我所有的 's。Mongoid::Document与其制作一个模块并将其包含在Mongoid::Document我想要扩展的每个模块中,还应该有另一种方法。

例如,对于 ruby​​ 类 Array,我只需重新打开该类并添加我想要的方法:

class Array
  def my_new_method
    #....
  end
end

但是我该怎么做Mongoid::Document呢?

4

2 回答 2

2

我会这样做

module Mongoid::Document
    def self.validate
        ...
    end
end

然而,我会避免打开一个外部模块(即使你这看起来)是 ruby​​ 社区中常见的事情。什么是反对明确地包含你自己的模块?

于 2013-02-23T10:42:59.493 回答
1

如果您要像使用 Array 一样打开一个类,最好这样做:

module MyNewMethodable
  def my_new_method( *args )
    fail ArgumentError, "not the right number of arguments"
    #....
  rescue => error
    if MyNewMethodable::Error
      puts "because then users of your module will know where to look for the fault"
    else
      raise error
    end
  end

  class Error < StandardError; end
  class ArgumentError < Error; end

end


class Array
  include MyNewMethodable
end

为 Mongoid::Document 执行此操作

class Mongoid::Document
  include MyNewMethodable
end

但是,这里

文档是 Mongoid 中的核心对象,任何要持久化到数据库的对象都必须包含 Mongoid::Document。

所以它已经包含在您定义的类中。因此,我建议您将模块包含在您的课程中,而不是包含在Mongoid::Document. 例如

class MyClass
  include Mongoid::Document
  include MyNewMethodable
end
于 2013-02-24T15:11:58.367 回答