class FuzzyRecord::FuzzySearcher
Public Class Methods
find(klass,args)
click to toggle source
# File lib/fuzzy_record/fuzzy_searcher.rb, line 2 def self.find(klass,args) new(klass,args).find end
new(klass,args)
click to toggle source
# File lib/fuzzy_record/fuzzy_searcher.rb, line 3 def initialize(klass,args) @class = klass @records = @class.all @args = args @search = create_search end
Public Instance Methods
find()
click to toggle source
# File lib/fuzzy_record/fuzzy_searcher.rb, line 9 def find @records.select{ |record| include_record(record)}.sort_by{|record| sorter(record)} end
Private Instance Methods
ave(arry)
click to toggle source
# File lib/fuzzy_record/fuzzy_searcher.rb, line 14 def ave(arry) arry.sum.to_f / arry.length end
create_search()
click to toggle source
# File lib/fuzzy_record/fuzzy_searcher.rb, line 19 def create_search return @args if @args.is_a? Hash [:fuzzy_name, :ident, :name].each do |field| return {field => @args} if @class.attribute_method?(field) end end
generalize(str)
click to toggle source
# File lib/fuzzy_record/fuzzy_searcher.rb, line 13 def generalize(str) ".*#{str.gsub(/[^a-zA-Z&0-9]/, "").chars.to_a.join(".*")}.*" rescue(nil) end def ave(arry) arry.sum.to_f / arry.length end def matches?(record,k,v) !!(record.send(k) == v || record.send(k).to_s =~ /#{generalize(v)}/i) end def sorter(record) ave(@search.map{|k,v| (v.to_s ^ record.send(k).to_s rescue(0))}) end def include_record(record) @search.map{|k,v| matches?(record,k,v)}.inject(:&) end def create_search return @args if @args.is_a? Hash [:fuzzy_name, :ident, :name].each do |field| return {field => @args} if @class.attribute_method?(field) end end
include_record(record)
click to toggle source
# File lib/fuzzy_record/fuzzy_searcher.rb, line 17 def include_record(record) @search.map{|k,v| matches?(record,k,v)}.inject(:&) end
matches?(record,k,v)
click to toggle source
# File lib/fuzzy_record/fuzzy_searcher.rb, line 15 def matches?(record,k,v) !!(record.send(k) == v || record.send(k).to_s =~ /#{generalize(v)}/i) end
sorter(record)
click to toggle source
# File lib/fuzzy_record/fuzzy_searcher.rb, line 16 def sorter(record) ave(@search.map{|k,v| (v.to_s ^ record.send(k).to_s rescue(0))}) end def include_record(record) @search.map{|k,v| matches?(record,k,v)}.inject(:&) end def create_search return @args if @args.is_a? Hash [:fuzzy_name, :ident, :name].each do |field| return {field => @args} if @class.attribute_method?(field) end end end