3
4
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
# File 'lib/tableficate/finder.rb', line 3
def tableficate(params)
scope = @scope || self
raise Tableficate::MissingScope unless scope.new.kind_of?(ActiveRecord::Base)
if params
if params[:filter]
params[:filter].each do |name, value|
next if value.blank? or (value.is_a?(Hash) and value.all?{|key, value| value.blank?})
name = name.to_sym
value.strip! if value.is_a?(String)
if @filter and @filter[name]
if @filter[name].is_a?(Proc)
scope = @filter[name].call(value, scope)
elsif value.is_a?(String)
value = "%#{value}%" if @filter[name][:match] == 'contains'
scope = scope.where(["#{get_full_column_name(@filter[name][:field])} LIKE ?", value])
elsif value.is_a?(Array)
full_column_name = get_full_column_name(@filter[name][:field])
if @filter[name][:match] == 'contains'
scope = scope.where([
Array.new(value.size, "#{full_column_name} LIKE ?").join(' OR '),
*value.map{|v| "%#{v}%"}
])
else
scope = scope.where(["#{full_column_name} IN(?)", value])
end
elsif value.is_a?(Hash)
scope = scope.where(["#{get_full_column_name(@filter[name][:field])} BETWEEN :start AND :stop", value])
end
elsif value.is_a?(Array)
scope = scope.where(["#{get_full_column_name(name.to_s.gsub(/\W/, ''))} IN(?)", value])
elsif value.is_a?(Hash)
scope = scope.where(["#{get_full_column_name(name.to_s.gsub(/\W/, ''))} BETWEEN :start AND :stop", value])
else
scope = scope.where(["#{get_full_column_name(name.to_s.gsub(/\W/, ''))} LIKE ?", value])
end
end
end
end
column = params.try(:[], :sort).try(:gsub, /\W/, '') || @default_sort.try(:[], 0)
dir = (params.try(:[], :dir) || @default_sort.try(:[], 1) || 'asc').downcase
if column.present?
scope = scope.order(@sort.try(:[], column.to_sym) || "#{get_full_column_name(column.to_s)} ASC")
scope = scope.reverse_order if dir == 'desc'
end
scope = scope.tableficate_ext
sorting = {column: nil, dir: nil}
if column.present?
sorting[:column] = column.to_sym
sorting[:dir] = ['asc', 'desc'].include?(dir) ? dir : 'asc'
end
scope.tableficate_add_data(:current_sort, sorting)
scope
end
|