使用实例方法扩展我的所有Mongoid文档

时间:2013-02-23 06:44:29

标签: ruby mongodb sinatra mongoid

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

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

class Array
  def my_new_method
    #....
  end
end

但我如何才能Mongoid::Document

2 个答案:

答案 0 :(得分:2)

我会这样做

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

但是,我不会打开外部模块(即使你看起来这样)在ruby社区中常常做的事情。有什么可以反对明确包含你自己的模块?

答案 1 :(得分: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

但是,它说here

  

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

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

class MyClass
  include Mongoid::Document
  include MyNewMethodable
end