Skip to content

Map incoming controller parameters to named scopes in your models

License

Notifications You must be signed in to change notification settings

FidMe/active_filters

Repository files navigation

ActiveFilters

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.

Installation

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

Usage

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

Initializer

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'

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/FidMe/active_filters.

License

The gem is available as open source under the terms of the MIT License.

About

Map incoming controller parameters to named scopes in your models

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published