Module: Elasticsearch::Model::Response::Pagination::WillPaginate

Defined in:
lib/elasticsearch/model/response/pagination/will_paginate.rb

Overview

Allow models to be paginated with the “will_paginate” gem [github.com/mislav/will_paginate]

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



13
14
15
16
17
18
19
20
21
# File 'lib/elasticsearch/model/response/pagination/will_paginate.rb', line 13

def self.included(base)
  base.__send__ :include, ::WillPaginate::CollectionMethods

  # Include the paging methods in results and records
  #
  methods = [:current_page, :offset, :length, :per_page, :total_entries, :total_pages, :previous_page, :next_page, :out_of_bounds?]
  Elasticsearch::Model::Response::Results.__send__ :delegate, *methods, to: :response
  Elasticsearch::Model::Response::Records.__send__ :delegate, *methods, to: :response
end

Instance Method Details

#__default_per_pageObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns the models’s ‘per_page` value or the default



87
88
89
# File 'lib/elasticsearch/model/response/pagination/will_paginate.rb', line 87

def __default_per_page
  klass.respond_to?(:per_page) && klass.per_page || ::WillPaginate.per_page
end

#current_pageObject

Return the current page



49
50
51
# File 'lib/elasticsearch/model/response/pagination/will_paginate.rb', line 49

def current_page
  search.definition[:from] / per_page + 1 if search.definition[:from] && per_page
end

#lengthObject



27
28
29
# File 'lib/elasticsearch/model/response/pagination/will_paginate.rb', line 27

def length
  search.definition[:size]
end

#offsetObject



23
24
25
# File 'lib/elasticsearch/model/response/pagination/will_paginate.rb', line 23

def offset
  (current_page - 1) * per_page
end

#page(num) ⇒ Object

Pagination method

Examples:


Article.search('foo').page(2)


59
60
61
# File 'lib/elasticsearch/model/response/pagination/will_paginate.rb', line 59

def page(num)
  paginate(page: num, per_page: per_page) # shorthand
end

#paginate(options) ⇒ Object

Main pagination method

Examples:


Article.search('foo').paginate(page: 1, per_page: 30)


37
38
39
40
41
42
43
44
45
# File 'lib/elasticsearch/model/response/pagination/will_paginate.rb', line 37

def paginate(options)
  param_name = options[:param_name] || :page
  page       = [options[param_name].to_i, 1].max
  per_page   = (options[:per_page] || __default_per_page).to_i

  search.definition.update size: per_page,
                           from: (page - 1) * per_page
  self
end

#per_page(num = nil) ⇒ Object

Return or set the “size” value

Examples:


Article.search('foo').per_page(15).page(2)


69
70
71
72
73
74
75
# File 'lib/elasticsearch/model/response/pagination/will_paginate.rb', line 69

def per_page(num = nil)
  if num.nil?
    search.definition[:size]
  else
    paginate(page: current_page, per_page: num) # shorthand
  end
end

#total_entriesObject

Returns the total number of results



79
80
81
# File 'lib/elasticsearch/model/response/pagination/will_paginate.rb', line 79

def total_entries
  results.total
end