Class: Huginn::Datatable::Paginator

Inherits:
Object
  • Object
show all
Defined in:
lib/huginn/datatable/paginator.rb

Overview

Splits datatable execution into two phases:

1. build the filtered/ordered relation
2. count lean, paginate with Pagy, then preload associations only
 on the small paginated subset.

The base relation never carries joins (association filters, ranges, orders and the search are all resolved through primary-key subqueries), so the count stays a plain COUNT(*) over the stripped relation.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(relation, params, includes: []) ⇒ Paginator

Returns a new instance of Paginator.



23
24
25
26
27
# File 'lib/huginn/datatable/paginator.rb', line 23

def initialize(relation, params, includes: [])
  @relation = relation
  @params = params
  @includes = Array(includes).compact
end

Instance Attribute Details

#includesObject (readonly)

Returns the value of attribute includes.



17
18
19
# File 'lib/huginn/datatable/paginator.rb', line 17

def includes
  @includes
end

#paramsObject (readonly)

Returns the value of attribute params.



17
18
19
# File 'lib/huginn/datatable/paginator.rb', line 17

def params
  @params
end

#relationObject (readonly)

Returns the value of attribute relation.



17
18
19
# File 'lib/huginn/datatable/paginator.rb', line 17

def relation
  @relation
end

Class Method Details

.call(relation, params, includes: []) ⇒ Object



19
20
21
# File 'lib/huginn/datatable/paginator.rb', line 19

def self.call(relation, params, includes: [])
  new(relation, params, includes: includes).call
end

Instance Method Details

#callObject



29
30
31
32
33
34
35
# File 'lib/huginn/datatable/paginator.rb', line 29

def call
  pagy = build_pagy
  data = relation.offset(pagy.offset).limit(limit_for(pagy))
  data = data.preload(*includes) if includes.any?

  { total_count: pagy.count, data: data }
end