module LinkedRails::Model::Filtering::ClassMethods
Public Instance Methods
filter_options()
click to toggle source
Calls superclass method
# File lib/linked_rails/model/filtering.rb, line 15 def filter_options class_variables.include?(:@@filter_options) ? super : {} end
filterable(options = {})
click to toggle source
# File lib/linked_rails/model/filtering.rb, line 19 def filterable(options = {}) initialize_filter_options self.filter_options = HashWithIndifferentAccess.new(options).merge(filter_options) options.map { |k, filter| define_filter_method(k, filter) } end
Private Instance Methods
boolean_filter(true_filter, false_filter, options = {})
click to toggle source
# File lib/linked_rails/model/filtering.rb, line 29 def boolean_filter(true_filter, false_filter, options = {}) { filter: resolve_boolean_filter(true_filter, false_filter), values: [true, false] }.merge(options) end
define_enum_filter_method(key, filter, enum_map)
click to toggle source
# File lib/linked_rails/model/filtering.rb, line 55 def define_enum_filter_method(key, filter, enum_map) define_method key do filter[:values].key(enum_map[send(filter[:attr] || key)]) end define_method "#{key}=" do |value| send("#{filter[:attr]}=", enum_map.key(filter[:values][value&.to_sym])) end end
define_filter_method(key, filter)
click to toggle source
# File lib/linked_rails/model/filtering.rb, line 42 def define_filter_method(key, filter) method = predicate_mapping[key]&.key return if !method || method_defined?(method) || !filter[:attr] enum_map = defined_enums[method.to_s] if enum_map define_enum_filter_method(method, filter, enum_map) else define_plain_filter_method(method, filter) end end
define_plain_filter_method(key, filter)
click to toggle source
# File lib/linked_rails/model/filtering.rb, line 65 def define_plain_filter_method(key, filter) define_method key do filter[:values][send(filter[:attr])] end define_method "#{key}=" do |value| send("#{filter[:attr]}=", filter[:values].key(value)) end end
initialize_filter_options()
click to toggle source
# File lib/linked_rails/model/filtering.rb, line 36 def initialize_filter_options return if filter_options && method(:filter_options).owner == singleton_class self.filter_options = superclass.try(:filter_options)&.dup || {} end
resolve_boolean_filter(true_filter, false_filter)
click to toggle source
# File lib/linked_rails/model/filtering.rb, line 75 def resolve_boolean_filter(true_filter, false_filter) lambda { |scope, values| if values.include?(true) && values.include?(false) scope else values.reduce(scope) do |_sub_scope, val| val ? true_filter.call(scope) : false_filter.call(scope) end end } end