Sha256: 81763fa4c75a7452874084a47c38f3d9356863748ba63d5d6fca7cc6af47242d

Contents?: true

Size: 1.95 KB

Versions: 1

Compression:

Stored size: 1.95 KB

Contents

# encoding: UTF-8
module MongoMapper
  module Support
    # @api private
    module Find
      def dynamic_find(finder, args)
        attributes = {}

        finder.attributes.each_with_index do |attr, index|
          attributes[attr] = args[index]
        end

        options = args.extract_options!.merge(attributes)

        if result = send(finder.finder, options)
          result
        else
          if finder.raise?
            raise DocumentNotFound, "Couldn't find Document with #{attributes.inspect} in collection named #{collection.name}"
          end

          if finder.instantiator
            self.send(finder.instantiator, attributes)
          end
        end
      end

      class DynamicFinder
        attr_reader :method, :attributes, :finder, :bang, :instantiator

        def initialize(method)
          @method = method
          @finder = :first
          @bang   = false
          match
        end

        def found?
          @finder.present?
        end

        def raise?
          bang == true
        end

        protected
          def match
            case method.to_s
              when /^find_(all_by|by)_([_a-zA-Z]\w*)$/
                @finder = :all if $1 == 'all_by'
                names = $2
              when /^find_by_([_a-zA-Z]\w*)\!$/
                @bang = true
                names = $1
              when /^find_or_(initialize|create)_by_([_a-zA-Z]\w*)$/
                @instantiator = $1 == 'initialize' ? :new : :create
                names = $2
              else
                @finder = nil
            end

            @attributes = names && names.split('_and_')
          end
      end

      protected
        def method_missing(method, *args, &block)
          finder = DynamicFinder.new(method)

          if finder.found?
            dynamic_find(finder, args)
          else
            super
          end
        end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mongo_mapper_ign-0.7.8 lib/mongo_mapper/support/find.rb