Sha256: b1ffe75d764f42608cca342059a98dbe88e54801e6ac9d7c93cdb758df8ed74f

Contents?: true

Size: 970 Bytes

Versions: 1

Compression:

Stored size: 970 Bytes

Contents

module Kangaroo
  module Model
    module DynamicFinder
      
      def respond_to? name, *args
        case name.to_s
        when /^find_(all|first|last|)_?by_(.+)$/
          true
        else
          super
        end
      end
      
      protected
      def method_missing name, *args
        name = name.to_s
        case name
        when /^find_(all|first|last|)_?by_(.+)$/
          finder = $1.blank? ? :first : $1
          fields = $2.split '_and_'
          define_dynamic_finder name, fields do |relation|
            relation.send finder
          end
          send name, *args
        else
          super
        end
      end
      
      def define_dynamic_finder name, keys
        singleton_class.send :define_method, name do |*values|
          conditions = {}
          keys.each_with_index do |key, i|
            conditions[key] = values[i]
          end
          
          yield where(conditions)
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
kangaroo-0.1.0.alpha1 lib/kangaroo/model/dynamic_finder.rb