Sha256: 3e0802c17149c694b7a32964155365f69d857f2b2f678a79add83160c8975138

Contents?: true

Size: 1.6 KB

Versions: 8

Compression:

Stored size: 1.6 KB

Contents

# encoding: utf-8
module Mongoid #:nodoc:
  module Criterion #:nodoc:

    class Selector < Hash
      attr_reader :klass

      def initialize(klass)
        @klass = klass
      end

      def []=(key, value)
        super(key, try_to_typecast(key, value))
      end

      def merge!(other)
        other.each_pair do |key, value|
          self[key] = value
        end
        self
      end
      alias update merge!

      if RUBY_VERSION < '1.9'
        def inspect
          ret = self.keys.inject([]) do |ret, key|
            ret << "#{key.inspect}=>#{self[key].inspect}"
          end
          "{#{ret.sort.join(', ')}}"
        end
      end

      private

      def try_to_typecast(key, value)
        access = key.to_s
        return value unless klass.fields.has_key?(access)

        field = klass.fields[access]
        typecast_value_for(field, value)
      end

      def typecast_value_for(field, value)
        return field.set(value) if field.type === value
        case value
        when Hash
          value = value.dup
          value.each_pair do |k, v|
            value[k] = typecast_hash_value(field, k, v)
          end
        when Array
          value.map { |v| typecast_value_for(field, v) }
        when Regexp
          value
        else
          field.type == Array ? value.class.set(value) : field.set(value)
        end
      end

      def typecast_hash_value(field, key, value)
        case key
        when "$exists"
          Boolean.set(value)
        when "$size"
          Integer.set(value)
        else
          typecast_value_for(field, value)
        end
      end

    end

  end
end

Version data entries

8 entries across 8 versions & 2 rubygems

Version Path
mongoid-2.0.0.rc.7 lib/mongoid/criterion/selector.rb
stonegao-mongoid-2.0.0.rc.6 lib/mongoid/criterion/selector.rb
mongoid-2.0.0.rc.6 lib/mongoid/criterion/selector.rb
mongoid-2.0.0.rc.5 lib/mongoid/criterion/selector.rb
mongoid-2.0.0.rc.4 lib/mongoid/criterion/selector.rb
mongoid-2.0.0.rc.3 lib/mongoid/criterion/selector.rb
mongoid-2.0.0.rc.2 lib/mongoid/criterion/selector.rb
mongoid-2.0.0.rc.1 lib/mongoid/criterion/selector.rb