class Filterameter::FilterFactory

Filter Factory

Class FilterFactory builds a filter from a FilterDeclaration.

Public Class Methods

new(model_class) click to toggle source
# File lib/filterameter/filter_factory.rb, line 17
def initialize(model_class)
  @model_class = model_class
end

Public Instance Methods

build(declaration) click to toggle source
# File lib/filterameter/filter_factory.rb, line 21
def build(declaration)
  model = declaration.nested? ? model_from_association(declaration.association) : @model_class
  filter = build_filter(model, declaration)

  declaration.nested? ? Filterameter::Filters::NestedFilter.new(declaration.association, model, filter) : filter
end

Private Instance Methods

build_filter(model, declaration) click to toggle source
# File lib/filterameter/filter_factory.rb, line 30
def build_filter(model, declaration) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
  # checking dangerous_class_method? excludes any names that cannot be scope names, such as "name"
  if model.respond_to?(declaration.name) && !model.dangerous_class_method?(declaration.name)
    Filterameter::Filters::ScopeFilter.new(declaration.name)
  elsif declaration.partial_search?
    Filterameter::Filters::MatchesFilter.new(declaration.name, declaration.partial_options)
  elsif declaration.minimum?
    Filterameter::Filters::MinimumFilter.new(model, declaration.name)
  elsif declaration.maximum?
    Filterameter::Filters::MaximumFilter.new(model, declaration.name)
  else
    Filterameter::Filters::AttributeFilter.new(declaration.name)
  end
end
model_from_association(association) click to toggle source

TODO: rescue then raise custom error with cause

# File lib/filterameter/filter_factory.rb, line 46
def model_from_association(association)
  [association].flatten.reduce(@model_class) { |memo, name| memo.reflect_on_association(name).klass }
  # rescue StandardError => e
end