42 lines
961 B
Ruby
42 lines
961 B
Ruby
|
module ActiveRecord
|
||
|
class DynamicFinderMatch
|
||
|
def self.match(method)
|
||
|
df_match = self.new(method)
|
||
|
df_match.finder ? df_match : nil
|
||
|
end
|
||
|
|
||
|
def initialize(method)
|
||
|
@finder = :first
|
||
|
case method.to_s
|
||
|
when /^find_(all_by|last_by|by)_([_a-zA-Z]\w*)$/
|
||
|
@finder = :last if $1 == 'last_by'
|
||
|
@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
|
||
|
@attribute_names = names && names.split('_and_')
|
||
|
end
|
||
|
|
||
|
attr_reader :finder, :attribute_names, :instantiator
|
||
|
|
||
|
def finder?
|
||
|
!@finder.nil? && @instantiator.nil?
|
||
|
end
|
||
|
|
||
|
def instantiator?
|
||
|
@finder == :first && !@instantiator.nil?
|
||
|
end
|
||
|
|
||
|
def bang?
|
||
|
@bang
|
||
|
end
|
||
|
end
|
||
|
end
|