5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
# File 'lib/manage/fields/searcher.rb', line 5
def generate_search_object(resource_class, search_fields)
search_class = Class.new do
include SearchObject.module(:model, :sorting)
def escape_search_term(term)
"%#{term.gsub(/\s+/, '%').gsub('.', '_')}%".downcase
end
def parse_date(date)
Date.strptime(date, '%Y-%m-%d') rescue nil
end
end
search_class.scope { resource_class.all }
Object.const_set("#{resource_class.name.gsub(/:/, '')}Searcher", search_class)
search_fields.select {|f| not f.to_s.include?('.')}.each do |field|
field_type = resource_class.columns_hash[field.to_s].type
case field_type
when *[:text, :string]
search_class.option field.to_sym do |scope, value|
value.blank? ? scope : scope.where("lower(#{field.to_s}) LIKE lower(?)", escape_search_term(value))
end
when :datetime
search_class.option field.to_sym do |scope, value|
date = parse_date value
scope.where("DATE(#{field.to_s}) >= ?", date) if date.present?
end
when :integer
search_class.option field.to_sym
when :boolean
search_class.option field.to_sym
else
search_class.option field.to_sym do |scope, value|
scope.where "#{field.to_s} = '?'", escape_search_term(value)
end
end
end
search_class
end
|