mongoid/mongoid

View on GitHub
lib/mongoid/matchable/default.rb

Summary

Maintainability
A
0 mins
Test Coverage
# encoding: utf-8
module Mongoid
  module Matchable

    # Contains all the default behavior for checking for matching documents
    # given MongoDB expressions.
    class Default

      attr_accessor :attribute, :document

      # Creating a new matcher only requires the value.
      #
      # @example Create a new matcher.
      #   Default.new("attribute")
      #
      # @param [ Object ] attribute The current attribute to check against.
      #
      # @since 1.0.0
      def initialize(attribute, document = nil)
        @attribute, @document = attribute, document
      end

      # Return true if the attribute and value are equal, or if it is an array
      # if the value is included.
      #
      # @example Does this value match?
      #   default.matches?("value")
      #
      # @param [ Object ] value The value to check if it matches.
      #
      # @return [ true, false ] True if matches, false if not.
      #
      # @since 1.0.0
      def matches?(value)
        attribute.is_a?(Array) && !value.is_a?(Array) ? attribute.any? { |_attribute| value === _attribute } : value === attribute
      end

      protected

      # Convenience method for getting the first value in a hash.
      #
      # @example Get the first value.
      #   matcher.first(:test => "value")
      #
      # @param [ Hash ] hash The has to pull from.
      #
      # @return [ Object ] The first value.
      #
      # @since 1.0.0
      def first(hash)
        hash.values.first
      end

      # If object exists then compare the two, otherwise return false
      #
      # @example Determine if we can compare.
      #   matcher.determine("test", "$in")
      #
      # @param [ Object ] value The value to compare with.
      # @param [ Symbol, String ] operator The comparison operation.
      #
      # @return [ true, false ] The comparison or false.
      #
      # @since 1.0.0
      def determine(value, operator)
        attribute.__array__.any? {|attr|
          attr ? attr.send(operator, first(value)) : false
        }
      end
    end
  end
end