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