Module: EasyFilter::ModelAdditions

Defined in:
lib/easy_filter/model_additions.rb

Overview

Define methods for ActiveRecord

Instance Method Summary collapse

Instance Method Details

#easy_filter(params, prefixes = { main: 'filter_', from: 'from_', to: 'to_', exact: 'exact_', sort: 'sort', direction: 'direction' }) ⇒ Object



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
# File 'lib/easy_filter/model_additions.rb', line 4

def easy_filter(params, prefixes = { main: 'filter_',
                                     from: 'from_',
                                     to: 'to_',
                                     exact: 'exact_',
                                     sort: 'sort',
                                     direction: 'direction' })
  filter = self
  params.each do |key, value|
    next unless key.start_with?(prefixes[:main]) && !value.blank? && key != "#{prefixes[:main]}button"

    field = key.gsub(prefixes[:main], '').to_s
    if field.start_with?(prefixes[:from])
      filter = filter.where("#{field.gsub(prefixes[:from], '')} >= ?", value)
    elsif field.start_with?(prefixes[:to])
      filter = filter.where("#{field.gsub(prefixes[:to], '')} <= ?", value)
    elsif field.start_with?(prefixes[:exact])
      filter = filter.where("#{field.gsub(prefixes[:exact], '')} = ?", value)
    else
      filter = filter.where("#{field} like ?", "%#{value}%")
    end
  end
  params[prefixes[:sort]] ||= 'id'
  params[prefixes[:direction]] ||= 'desc'

  sort_column = column_names.include?(params[prefixes[:sort]]) ? params[prefixes[:sort]] : 'id'
  sort_direction = %w(asc desc).include?(params[prefixes[:direction]]) ? params[prefixes[:direction]] : 'desc'

  filter.order("#{sort_column} #{sort_direction}")
end