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