module Filtron

Constants

VERSION

Public Instance Methods

filter(filters) click to toggle source
# File lib/filtron.rb, line 29
def filter(filters)
  conditions = filters_to_conditions(filters)

  if filters[:ransack_options]
    search(conditions).result(filters[:ransack_options])
  else
    search(conditions)
  end
end
filter_with(param, predicate, options = {}, &block) click to toggle source
# File lib/filtron.rb, line 16
def filter_with(param, predicate, options = {}, &block)
  filtron_filters[param] = [predicate, options, block]
end
filtron_filters() click to toggle source
# File lib/filtron.rb, line 4
def filtron_filters
  @filtron_filters ||= {}
end
filtron_query_param() click to toggle source
# File lib/filtron.rb, line 12
def filtron_query_param
  @filtron_query_param ||= :q
end
filtron_query_predicate() click to toggle source
# File lib/filtron.rb, line 8
def filtron_query_predicate
  @filtron_query_predicate
end
queries(*columns) click to toggle source
# File lib/filtron.rb, line 20
def queries(*columns)
  options = columns[-1].is_a?(Hash) ? columns.pop : {}
  suffix  = options.fetch(:suffix, "_cont")
  suffix  = "_#{suffix}" unless suffix.start_with?("_")

  @filtron_query_param     = options.fetch(:with, @filtron_query_param)
  @filtron_query_predicate = columns.join("_or_") + suffix
end

Protected Instance Methods

add_query_predicate(filters, params) click to toggle source
# File lib/filtron.rb, line 60
def add_query_predicate(filters, params)
  key = filtron_query_param
  if key && params[key]
    filters << [filtron_query_predicate, params[key]]
  end
end
filters_from_predicates(params, predicates) click to toggle source
# File lib/filtron.rb, line 48
def filters_from_predicates(params, predicates)
  slice(params, *predicates.keys).map do |key, value|
    filter = predicates[key]
    value  = filter[-1].call(value) if filter[-1].respond_to?(:call)
    [filter[0], value]
  end
end
filters_to_conditions(params) click to toggle source
# File lib/filtron.rb, line 41
def filters_to_conditions(params)
  predicates = filtron_filters
  filters    = filters_from_predicates(params, predicates)
  add_query_predicate(filters, params)
  Hash[filters]
end
slice(hash, *keys) click to toggle source
# File lib/filtron.rb, line 56
def slice(hash, *keys)
  keys.each_with_object({}) { |k, h| h[k] = hash[k] if hash.key?(k) }
end