3

私はこの構文{:age.gt => 60}を不思議に思っています。この構文はmongoid. それはどのように機能しますか?私は mongoid のソース コードをチェックしていますが、Symbolクラスをあまり拡張していませんでしたmatchers。また、gt.rb、lt.rb、... を含むディレクトリがあります。これらのファイルは条件付けロジックに使用されます: 大なり、小なりより....それがSymbolクラスとどのように関係しているか理解できません。

通常の irb セッションでは、次のエラーが表示されます。

NoMethodError: undefined method `gt' for :age:Symbol

誰でも私を説明できますか?

4

4 に答える 4

3

Mongoid::Criterion::Complexこれは、このシンボルの語尾変化ファイルの一部として mongoid 自体によって行われます。奇妙なことに、このファイルは master ブランチにはもうありませんが、プロジェクトで 2.4.7 を使用しており、そこに存在します (おそらく移動したばかりですが、master では見つかりません)。

かなり興味深い魔法のビット。魔法は必要だとは思いませんが、私には問題ないように:field => { :$gt => 5 }見えますが、とにかく:)

于 2012-05-26T17:38:21.773 に答える
2

2.4.10 の現在リリースされているバージョンについては、@rfunduk の回答を参照してください。

master ブランチでは、変更されています。これは、以下を必要とするoriginライブラリで見つけることができます。mongoid

https://github.com/mongoid/origin/blob/master/lib/origin/extensions/symbol.rb、具体的にはこの方法:

module Origin
  module Extensions
    module Symbol
      # ...
      module ClassMethods
        # Adds a method on symbol as a convenience for the MongoDB operator.
        #
        # @example Add the $in method.
        #   Symbol.add_key(:in, "$in")
        #
        # @param [ Symbol ] name The name of the method.
        # @param [ Symbol ] strategy The name of the merge strategy.
        # @param [ String ] operator The MongoDB operator.
        # @param [ String ] additional The additional MongoDB operator.
        #
        # @since 1.0.0
        def add_key(name, strategy, operator, additional = nil, &block)
          define_method(name) do
            method = "__#{strategy}__".to_sym
            Key.new(self, method, operator, additional, &block)
          end
        end

        # ...
      end
    end
  end
end

メインライブラリにリストされているマッチャーに基づいてgt、 、 などのメソッドを追加します (ファイルとフォルダーを参照してください)。gtemongoidstrategies.rbmatchers/

于 2012-05-26T17:39:02.253 に答える
2

関連するコードはこちら( Mongoid::Extensions::Symbol::Inflections) のようです。を使用して、実行時にこれらのことを掘り下げるのが最も簡単な場合がありますTracer

require 'tracer'
require 'mongoid'

Tracer.on {
  :test.gt
}

出力

#0:(irb):9:Object:-: -
#0:(eval):1:Mongoid::Extensions::Symbol::Inflections:>: -
#0:(eval):2:Mongoid::Extensions::Symbol::Inflections:-: -
#0:/home/abe/.rvm/gems/ruby-1.9.3-p125@deleteme/gems/mongoid-2.4.10/lib/mongoid/criterion/complex.rb:21:Mongoid::Criterion::Complex:>:       def initialize(opts = {})
#0:/home/abe/.rvm/gems/ruby-1.9.3-p125@deleteme/gems/mongoid-2.4.10/lib/mongoid/criterion/complex.rb:22:Mongoid::Criterion::Complex:-:         @key, @operator = opts[:key], opts[:operator]
#0:/home/abe/.rvm/gems/ruby-1.9.3-p125@deleteme/gems/mongoid-2.4.10/lib/mongoid/criterion/complex.rb:23:Mongoid::Criterion::Complex:<:       end
#0:(eval):3:Mongoid::Extensions::Symbol::Inflections:<: -
于 2012-05-26T17:41:44.203 に答える
0

見続ける...

...スコープ DSL を定義する方法は次のとおりです。

  • モンキーパッチSymbolまたはObjectメソッドで直接
  • method_missing意味のために名前を追加して解析する
于 2012-05-26T17:18:17.883 に答える