1

インスタンス メソッドを使用して、すべての拡張したいと考えています。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 に答える