module Rokaki::Filterable::ClassMethods
class methods such as define_filter_keys
which comprise the dsl
Private Instance Methods
_build_filter(keys)
click to toggle source
# File lib/rokaki/filterable.rb, line 50 def _build_filter(keys) keys.delete(or_key) name = @filter_key_prefix.to_s count = keys.size - 1 keys.each_with_index do |key, i| name += key.to_s name += filter_key_infix.to_s unless count == i end class_eval "def #{name}; #{filterable_object_name}.dig(*#{keys}); end;", __FILE__, __LINE__ end
_map_filters(query_field, keys)
click to toggle source
# File lib/rokaki/filterable.rb, line 63 def _map_filters(query_field, keys) keys.delete(or_key) name = @filter_key_prefix.to_s count = keys.size - 1 keys.each_with_index do |key, i| name += key.to_s name += filter_key_infix.to_s unless count == i end class_eval "def #{name}; #{filterable_object_name}.dig(:#{query_field}); end;", __FILE__, __LINE__ end
_nested_key(filters_object)
click to toggle source
# File lib/rokaki/filterable.rb, line 76 def _nested_key(filters_object) filters_object.keys.each do |key| deep_map([key], filters_object[key]) { |keys| _build_filter(keys) } end end
_nested_map(query_field, filters_object)
click to toggle source
# File lib/rokaki/filterable.rb, line 82 def _nested_map(query_field, filters_object) filters_object.keys.each do |key| deep_map([key], filters_object[key]) { |keys| _map_filters(query_field, keys) } end end
deep_map(keys, value) { |_keys| ... }
click to toggle source
# File lib/rokaki/filterable.rb, line 88 def deep_map(keys, value) if value.is_a? Hash value.keys.map do |key| _keys = keys.dup << key deep_map(_keys, value[key], &Proc.new) end end if value.is_a? Array value.each do |av| if av.is_a? Symbol _keys = keys.dup << av yield _keys else deep_map(keys, av, &Proc.new) end end end if value.is_a? Symbol _keys = keys.dup << value yield _keys end end
define_filter_keys(*filter_keys)
click to toggle source
# File lib/rokaki/filterable.rb, line 16 def define_filter_keys(*filter_keys) filter_keys.each do |filter_key| _build_filter([filter_key]) unless Hash === filter_key _nested_key filter_key if Hash === filter_key end end
define_filter_map(query_field, *filter_keys)
click to toggle source
# File lib/rokaki/filterable.rb, line 23 def define_filter_map(query_field, *filter_keys) filter_keys.each do |filter_key| _map_filters(query_field, [filter_key]) unless Hash === filter_key _nested_map query_field, filter_key if Hash === filter_key end end
define_query_key(key = nil)
click to toggle source
# File lib/rokaki/filterable.rb, line 30 def define_query_key(key = nil) @filter_map_query_key = key end
filter_key_infix(infix = :_)
click to toggle source
# File lib/rokaki/filterable.rb, line 38 def filter_key_infix(infix = :_) @filter_key_infix ||= infix end
filter_key_prefix(prefix = nil)
click to toggle source
# File lib/rokaki/filterable.rb, line 34 def filter_key_prefix(prefix = nil) @filter_key_prefix ||= prefix end
filterable_object_name(name = 'filters')
click to toggle source
# File lib/rokaki/filterable.rb, line 46 def filterable_object_name(name = 'filters') @filterable_object_name ||= name end
or_key(or_key = :or)
click to toggle source
# File lib/rokaki/filterable.rb, line 42 def or_key(or_key = :or) @or_key ||= or_key end