Sha256: 0631b073e51a19d2e602032406c1787fb6ed8e3d91ee54169a3844f5de227745

Contents?: true

Size: 1.33 KB

Versions: 1

Compression:

Stored size: 1.33 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.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

1 entries across 1 versions & 1 rubygems

Version Path
mongoid-2.0.0.beta.16 lib/mongoid/criterion/selector.rb