Sha256: e70b5aeab837db494c7e7bb8089d219f24b4f6f866d2b89104b2e568db268e00

Contents?: true

Size: 1.69 KB

Versions: 17

Compression:

Stored size: 1.69 KB

Contents

module MongoMapper
  # @api private
  module Finders
    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
    
    protected
      def method_missing(method, *args, &block)
        finder = DynamicFinder.new(method)

        if finder.found?
          dynamic_find(finder, args)
        else
          super
        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
end

Version data entries

17 entries across 17 versions & 2 rubygems

Version Path
novelys_mongo_mapper-0.6.12 lib/novelys_mongo_mapper/dynamic_finder.rb
novelys_mongo_mapper-0.6.11 lib/novelys_mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.2.3 lib/mongo_mapper/dynamic_finder.rb
novelys_mongo_mapper-0.6.10 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.2.2 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.2.1 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.1.31 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.1.30 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.1.29 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.1.28 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.1.27 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.1.26 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.1.25 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.1.22 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.1.21 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.1.20 lib/mongo_mapper/dynamic_finder.rb
mongo_mapper-unstable-2010.1.19 lib/mongo_mapper/dynamic_finder.rb