class GuessPaging::Paginate

Attributes

count[R]
current_page[R]
max_page[R]
query[R]
records[R]

Public Class Methods

new(query: nil, per_page: 10, essential: 3) click to toggle source
# File lib/guess_paging/paginate.rb, line 5
def initialize(query: nil, per_page: 10, essential: 3)
  @query = query
  @key = Digest::MD5.hexdigest(query.all.to_sql.to_s)
  @per_page = per_page
  @essential = essential
end

Public Instance Methods

guess(page_params: nil) click to toggle source
# File lib/guess_paging/paginate.rb, line 12
def guess(page_params: nil)
  get_max_page
  if page(page_params).length < @per_page
    last_page = @query.count / @per_page + 1
    GuessPaging::RedisClient.set(@key, last_page) if last_page != get_max_page
    @records = @query.limit(@per_page).offset(@per_page * (last_page - 1))
    @current_page = last_page
    @max_page = last_page
    @count = @query.count
  else
    @current_page = get_page(page_params)
    @max_page = get_max_page
    @count = @max_page * @per_page
  end
end

Private Instance Methods

get_max_page() click to toggle source
# File lib/guess_paging/paginate.rb, line 38
def get_max_page
  max = GuessPaging::RedisClient.get(@key).to_i
  if max.blank? || max.zero?
    all = @query.count
    max = all % @per_page == 0 ? all / @per_page : (all / @per_page + 1)
    GuessPaging::RedisClient.set(@key, max)
  end

  count_digit = max.to_s.length
  if count_digit > @essential
    i = max.to_f / (10 ** (count_digit - @essential))
    last_page = (i.ceil * 10 ** (count_digit - @essential)).to_i
  end
  last_page ||= max
end
get_page(page_params) click to toggle source
# File lib/guess_paging/paginate.rb, line 30
def get_page(page_params)
  page_params ? page_params.to_i : 1
end
page(page_params) click to toggle source
# File lib/guess_paging/paginate.rb, line 34
def page(page_params)
  @records = @query.limit(@per_page).offset(@per_page * (get_page(page_params) - 1))
end