Active Filters allows you to map incoming controller parameters to filter your resources by chaining scopes.
It is inspired by Justin Weiss solution offering a cleaner way to declare your filters.
The gem has_scope exists but does not handle params stored as the value of a hash.
Add this line to your application's Gemfile:
gem 'active_filters'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install active_filters
Let's say you have several scopes on your User model
class User < ApplicationRecord
scope :country, -> country_code { where(country: country_code) }
scope :gender, -> gender { where(gender: gender) }
end
And you want to chain thoses two scopes. You first need to include the Filterable controller module in your application controller
class ApplicationController < ActionController::Base
include ActiveFilters::Controller::Filterable
end
and then include the model Filterable one in the model you want to filter.
class User < ApplicationRecord
include ActiveFilters::Model::Filterable
scope :country, -> country_code { where(country: country_code) }
scope :gender, -> gender { where(gender: gender) }
end
Then you just need to declare your named scopes as filters using the has_filters
DSL
class UsersController < ApplicationController
has_filters :country, :gender
end
and apply them to a specific resource using the filter
class method and the filterable params
hash of params as argument.
class UsersController < ApplicationController
has_filters :country, :gender
def index
@users = User.with_filter(filterable_params)
end
end
For each request:
/users
#=> acts like a normal request
/users?country=FR&gender=female
#=> calls the named scope and bring only females in France
Now let's say you want to use incoming params stored as the value of a hash as scopes:
/users?filter[country]=FR&filter[gender]=female
#=> { filter: { country: 'FR', gender: 'female' } }
Then you can add the in_key
attribute with the name of the key in which params are stored.
class UsersController < ApplicationController
has_filters :country, :gender, in_key: :filter
def index
@users = User.filter(filterable_params)
end
end
By default the params variable used by Active Filters is params
.
If you want to use another params variable, you have to create an initializer in config/initializers/active_filters.rb
and set the variable name: (for instance with @params)
ActiveFilters::Setup.params_variable = '@params'
Bug reports and pull requests are welcome on GitHub at https://github.com/FidMe/active_filters.
The gem is available as open source under the terms of the MIT License.