module PoorManSearch::Searchable
Public Instance Methods
associative_search(key_words_string, *associations)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 34 def associative_search key_words_string, *associations ids = search(key_words_string).select("#{self.table_name}.id") ids += associations.collect{|as| scoped.includes(as).merge(asociation_class(as).search(key_words_string)).select("#{self.table_name}.id") }.flatten where(:id => ids.uniq) end
number_search(*fields)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 7 def number_search *fields @number_fields = fields end
search(key_words_string)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 19 def search key_words_string criteria = Criteria.new key_words_string t = self.arel_table search_scope = scoped clauses = string_clauses(t, criteria) clauses << number_clause(t, criteria) clauses << time_clause(t, criteria) clauses.compact.each{|clause| search_scope = search_scope.where(clause) } search_scope end
string_search(*fields)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 3 def string_search *fields @string_fields = fields end
time_range(*fields)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 15 def time_range *fields @time_fields = fields end
time_search(*fields)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 11 def time_search *fields @time_fields = fields end
Private Instance Methods
asociation_class(as_sym)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 44 def asociation_class as_sym _as = as_sym while(_as.is_a? Hash) do _as = _as.values.first end _as.to_s.singularize.classify.constantize end
fetch_from_time_range(table, start_time, end_time)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 99 def fetch_from_time_range(table, start_time, end_time) @time_fields.collect{|f| table[f].gteq(start_time).and(table[f].lteq(end_time)) } end
find_by_time(table, time)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 93 def find_by_time(table, time) return fetch_from_time_range(table, time, time+59.seconds) if (time.hour > 0 && time.min > 0) return fetch_from_time_range(table, time.beginning_of_hour, time.end_of_hour) if (time.hour > 0) return fetch_from_time_range(table, time.beginning_of_day, time.end_of_day) end
number_clause(t, criteria)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 67 def number_clause(t, criteria) return nil if @number_fields.blank? clause = nil criteria.numbers.collect do |value| @number_fields.collect{|f| t[f].eq(value) }.each{|t_node| clause = clause.or(t_node) rescue t_node } end clause end
string_clauses(t, criteria)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 52 def string_clauses(t, criteria) return [] if @string_fields.blank? criteria.strings.collect do |word| v = "%#{word}%" clause = nil @string_fields.collect{|f| t[f].matches(v) }.each{|t_node| clause = clause.or(t_node) rescue t_node } clause end end
time_clause(t, criteria)
click to toggle source
# File lib/poor_man_search/searchable.rb, line 80 def time_clause(t, criteria) return nil if @time_fields.blank? clause = nil criteria.times.each do |value| @time_fields.each{|f| find_by_time(t, value).each{|t_node| clause = clause.or(t_node) rescue t_node } } end clause end