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 |