Module: FilterMe

Extended by:
ActiveSupport::Concern
Defined in:
lib/filter_me.rb,
lib/filter_me/filter.rb,
lib/filter_me/version.rb,
lib/filter_me/filter/dsl.rb,
lib/filter_me/filterable.rb,
lib/filter_me/filter/field_validator.rb,
lib/filter_me/filter/arel_field_filter.rb

Defined Under Namespace

Modules: Filterable Classes: ActiveRecordFilter, Filter, FiltersNotWhiteListedError

Constant Summary collapse

VERSION =
'0.1.0'

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.normalize_param(param) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/filter_me.rb', line 12

def normalize_param(param)
  param.inject([]) do |filter, (k, v)|
    case v
    when Hash
      filter.push([k, FilterMe.normalize_param(v)])
    when Array
      filter.push([k, v])
    else
      filter.push([k, [v]])
    end
  end
end

Instance Method Details

#build_filter(filter_class) ⇒ Object



50
51
52
# File 'lib/filter_me.rb', line 50

def build_filter(filter_class)
  filter_class.new(filter_params, filter_configuration)
end

#filter_configurationObject



46
47
48
# File 'lib/filter_me.rb', line 46

def filter_configuration
  {}
end

#filter_me(relation, filter_class = nil) ⇒ Object



39
40
41
42
43
44
# File 'lib/filter_me.rb', line 39

def filter_me(relation, filter_class=nil)
  klass = filter_class || ActiveRecordFilter.filter_for(relation)
  filter = build_filter(klass)

  filter.filter(relation)
end

#filter_paramsObject

FilterMe default params example (Seems straight forward for Rails to parse):

{filters: {
  username: {matches: "sam%", not_in_any: ["sam", "samsinite"]},
  account: {type: {eq: "admin"}},
  company: {job: {name: {matches: "%software%"}}}
}}

Instead of Django Tastypie’s style (original inspiration):

[{username__matches: "%sam%"}, {account__type__eq: "admin"}]


85
86
87
# File 'lib/filter_me.rb', line 85

def filter_params
  FilterMe.normalize_param(params.fetch(:filters, {}))
end