class Pagoid::Pager

Attributes

options[RW]
paginatable[RW]

Public Class Methods

new(paginatable, options = {}) click to toggle source

Initialize

@param [Object] paginatable Some object(like an Array or ActiveRecord Object) for pagination @param [Hash] options options hash for tweaking pagination @option options [Fixnum] :page The page number @option options [Fixnum] :per_page The page size @option options [Fixnum] :order_by Callable on each element (or column) to sort by @option options [Fixnum] :direction “desc” or “asc”

# File lib/pagoid/pager.rb, line 24
def initialize(paginatable, options = {})
  self.paginatable = AdapterRouter.new(paginatable).route
  self.options = options.dup
end

Public Instance Methods

display_headers?() click to toggle source

Describes whether or not to publish paging reference

@return boolean describing whether to display pagination headers

# File lib/pagoid/pager.rb, line 54
def display_headers?
  !paginated.nil?
end
headers() click to toggle source

Hash of data for publishing on a payload for Paging reference

@return [Hash] hash of paging data

# File lib/pagoid/pager.rb, line 39
def headers
  {
    total: paginated.total_count,
    total_pages: paginated.total_pages,
    first_page: paginated.first_page?,
    last_page: paginated.last_page?,
    current_page: paginated.current_page,
    limit: paginated.limit_value,
    offset: paginated.offset_value
  }
end
paginated() click to toggle source

Memoized method of Paged, Sized, and Ordered output

@return ordered, sized, paged data

# File lib/pagoid/pager.rb, line 32
def paginated
  @paginated ||= pered
end

Private Instance Methods

direction() click to toggle source
# File lib/pagoid/pager.rb, line 119
def direction
  options[:direction].to_s == "asc" ? :asc : :desc
end
order_by() click to toggle source
# File lib/pagoid/pager.rb, line 115
def order_by
  (!options[:order_by].nil? ? options[:order_by] : :created_at).to_s
end
order_by_value(orderable) click to toggle source
# File lib/pagoid/pager.rb, line 103
def order_by_value(orderable)
  orderable.respond_to?(order_by) ? orderable.public_send(order_by) : orderable
end
order_callable() click to toggle source
# File lib/pagoid/pager.rb, line 79
def order_callable
  order_method_hash[order_method] || sort_proc || ->(o) { o }
end
order_method() click to toggle source
# File lib/pagoid/pager.rb, line 83
def order_method
  order_methods.find { |method| coerce.respond_to? method }
end
order_method_hash() click to toggle source
# File lib/pagoid/pager.rb, line 87
def order_method_hash
  {
    order: ->(orderable) { orderable.order "#{order_by} #{direction}" }
  }
end
order_methods() click to toggle source
# File lib/pagoid/pager.rb, line 107
def order_methods
  order_method_hash.keys
end
ordered() click to toggle source
# File lib/pagoid/pager.rb, line 67
def ordered
  coerce(order_callable.call(paginatable))
end
page() click to toggle source
# File lib/pagoid/pager.rb, line 111
def page
  options[:page].to_i > 0 ? options[:page].to_i : 1
end
paged() click to toggle source
# File lib/pagoid/pager.rb, line 71
def paged
  ordered.page(page)
end
per_page() click to toggle source
# File lib/pagoid/pager.rb, line 75
def per_page
  options[:per_page].to_i > 0 ? options[:per_page].to_i : 100
end
pered() click to toggle source
# File lib/pagoid/pager.rb, line 63
def pered
  paged.per(per_page)
end
sort_proc() click to toggle source
# File lib/pagoid/pager.rb, line 93
def sort_proc
  if coerce.respond_to?(:sort)
    ->(orderable) {
      orderable.sort { |a,b|
        direction == :asc ? order_by_value(a) <=> order_by_value(b) : order_by_value(b) <=> order_by_value(a)
      }
    }
  end
end