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