class Filtering::Base
Attributes
complex_params[R]
group[R]
order[R]
page[R]
params[R]
plain_params[R]
result[R]
Public Class Methods
new(params, args = {})
click to toggle source
# File lib/filtering/base.rb, line 2 def initialize(params, args = {}) @params = params @plain_params = permit(params, plain_acessible_params) @complex_params = permit(params, complex_acessible_params) @page = args[:page] @order = args[:order] end
Public Instance Methods
call()
click to toggle source
# File lib/filtering/base.rb, line 10 def call @result = relation filter_by_plain_params unless plain_params.empty? filter_by_complex_params unless complex_params.empty? paginate if page.present? && result.respond_to?(:page) ordering if order.present? grouping if group.present? return result end
Protected Instance Methods
complex_acessible_params()
click to toggle source
# File lib/filtering/base.rb, line 43 def complex_acessible_params; end
permit(params, acessible_params)
click to toggle source
# File lib/filtering/base.rb, line 31 def permit(params, acessible_params) return {} if acessible_params.nil? if params.respond_to?(:permit) params.permit(acessible_params) else params.symbolize_keys.slice(*acessible_params.map(&:to_sym)) end end
plain_acessible_params()
click to toggle source
# File lib/filtering/base.rb, line 41 def plain_acessible_params; end
relation()
click to toggle source
# File lib/filtering/base.rb, line 27 def relation raise 'relation method not implemented. Add this method to calling class and add AR relation, for example Model.all' end
Private Instance Methods
filter_by_complex_params()
click to toggle source
# File lib/filtering/base.rb, line 55 def filter_by_complex_params return if complex_params.empty? raise_if_complex_method_not_implemented complex_params.each do |key, value| @result = send("filter_by_#{key}", value) end end
filter_by_plain_params()
click to toggle source
# File lib/filtering/base.rb, line 47 def filter_by_plain_params return if plain_params.empty? plain_params.each do |key, value| @result = result.where("#{key}": value) if value.present? end end
grouping()
click to toggle source
# File lib/filtering/base.rb, line 80 def grouping @result = result.group(group) end
ordering()
click to toggle source
# File lib/filtering/base.rb, line 76 def ordering @result = result.order(order) end
paginate()
click to toggle source
# File lib/filtering/base.rb, line 72 def paginate @result = result.page(page) end
raise_if_complex_method_not_implemented()
click to toggle source
# File lib/filtering/base.rb, line 65 def raise_if_complex_method_not_implemented complex_acessible_params.each do |param| method_name = "filter_by_#{param}" raise "#{method_name} method not implemented. Add #{method_name} private method to #{self.class.name} or remove #{param} param from complex_acessible_params" unless self.private_methods.include?(method_name.to_sym) end end