Yaqb

Yet Another Query Builder

Yaqb is query builder that will filter, sort and paginate your ActiveRecord collections.

In addition to query building, presenters are used to manage what a consumer of your API can query.

Installation

In your Gemfile

# Choose your preferred pagination gem
gem 'kaminari' # or
gem 'will_paginate' # or
gem 'pagy'

# Then add
gem 'yaqb'

And then execute:

$ bundle

Or install it yourself as:

$ gem install yaqb

Configuration

By default, Yaqb will detect if you are using Kaminari, WillPaginate, or Pagy. If you want to change any of the configurable settings, you may do so:

Yaqb.configure do |config|
  # If for whatever reason you are using multiple pagination gems, you can manually set which gem to use.
  config.paginator = :kaminari # :will_paginate, :pagy
end

Usage

Controllers

In your controller, you will need to include the following the module: Yaqb::Base

class ApplicationController < ActionController::Base # or ActionController::API
  include Yaqb::Base
end

# And then to use Yaqb

class BooksController < ApplicationController
  def index
    # #orchestrate expects a collection and a presenter.
    # #orchestrate return a results object meaning you will have access to the following methods:
    # #scope - This is your collection after being filtered, sorted and paginated
    # #links - This returns a hash of links based on the paginated results.
    result = orchestrate(Books.all, BookPresenter)

    # Depending on your serializer you can render your data as so:
    # BluePrinter gem by procore is used here:
    render json: BookBlueprint.render(request.scope, root: :data, meta: { links: request.links })
  end
end

At the moment Yaqb will require the following parameters to be passed through:

pagination: page and per

sorting: sort and dir

filtering: q[]

Filtering

Supported predicates

The following predicates are available: eq, cont notcont start end gt lt

Predicates can be appended to a field set in your Presenter.

Parameters

Parameters are passed through the param q[].

E.g. To filter by a title containing a word: q[title_cont]

E.g. title_eq or created_at_lt

Presenters

Presenters will allow you to control what a consumer of your API can sort and filter by.

Your Presenter class will need to inherit from Yaqb::Presenter

class BookPresenter < Yaqb::Presenter
  sort_by :id, :title, :created_at, :updated_at
  filter_by :id, :title
end

Handling Errors

By default Yaqb will rescue from any query errors with QueryBuilderError and return that error to the consumer

Given the following API call:

GET https://api.example.com/v1/books?per=a

The following response will be returned

{
  "error": {
    "message": "Invalid pagination params. Only numbers are supported for \"page\" and \"per\"",
    "invalid_params": "per=a"
  }
}

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/yaqb. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

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

Code of Conduct

Everyone interacting in the Yaqb project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.