Module: Boosted::Controllers::Tabulatable

Extended by:
ActiveSupport::Concern
Defined in:
lib/boosted/controllers/tabulatable.rb

Overview

Provides functionality for filtering, sorting, searching, and paginating records from an ActiveRecord::Relation in a controller.

Example usage:

class UsersController < ApplicationController
  include Tabulatable

  tabulatable_by :name, :email, :age, 'posts.created_at', 'posts.id' => 'post_id'

  def index
    users = User.left_joins(:posts).group(:id)
    users = tabulate(users)
    render json: users, meta: tabulate_info
  end
end

There are cases where not all fields should be filterable or sortable. In such cases, you can use the ‘filterable_by` and `sortable_by` methods to override the tabulate fields.

Example:

class PostsController < ApplicationController
  include Tabulatable

  tabulatable_by :title, :content, :created_at, user: 'users.name'
  filterable_by :created_at, user: 'users.name'

  def index
    posts = Post.left_joins(:user).group(:id)
    posts = tabulate(posts)
    render json: posts, meta: tabulate_info
  end
end

Instance Method Summary collapse

Instance Method Details

#tabulate(scope) ⇒ ActiveRecord::Relation

Parameters:

  • scope (ActiveRecord::Relation)

Returns:

  • (ActiveRecord::Relation)

See Also:



72
73
74
75
76
77
# File 'lib/boosted/controllers/tabulatable.rb', line 72

def tabulate(scope)
  scope = filter(scope)
  scope = search(scope)
  scope = sort(scope)
  paginate(scope)
end

#tabulate_infoHash

Returns:

  • (Hash)


80
81
82
83
84
85
86
87
88
# File 'lib/boosted/controllers/tabulatable.rb', line 80

def tabulate_info
  {
    filters: filter_conditions(*filter_fields, *mapped_filter_fields),
    sorts: sort_conditions(*sort_fields, *mapped_sort_fields),
    search_term:,
    search_param:,
    page_info:
  }
end