Sha256: d51d1b0e9344066ce83097203b33206b95c6c3ed7d4515616eb09028944a9871

Contents?: true

Size: 1.38 KB

Versions: 4

Compression:

Stored size: 1.38 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!

      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

4 entries across 4 versions & 1 rubygems

Version Path
mongoid-2.0.0.beta.20 lib/mongoid/criterion/selector.rb
mongoid-2.0.0.beta.19 lib/mongoid/criterion/selector.rb
mongoid-2.0.0.beta.18 lib/mongoid/criterion/selector.rb
mongoid-2.0.0.beta.17 lib/mongoid/criterion/selector.rb