Class: RESTFramework::Paginators::PageNumberPaginator
- Inherits:
-
BasePaginator
- Object
- BasePaginator
- RESTFramework::Paginators::PageNumberPaginator
- Defined in:
- lib/rest_framework/paginators/page_number_paginator.rb
Overview
A simple paginator based on page numbers.
Instance Method Summary collapse
- #_page_size ⇒ Object
-
#get_page(page_number = nil) ⇒ Object
Get the page and return it so the caller can serialize it.
-
#get_paginated_response(serialized_page) ⇒ Object
Wrap the serialized page with appropriate metadata.
-
#initialize(**kwargs) ⇒ PageNumberPaginator
constructor
A new instance of PageNumberPaginator.
Constructor Details
#initialize(**kwargs) ⇒ PageNumberPaginator
Returns a new instance of PageNumberPaginator.
5 6 7 8 9 10 11 12 13 |
# File 'lib/rest_framework/paginators/page_number_paginator.rb', line 5 def initialize(**kwargs) super # Exclude any `select` clauses since that would cause `count` to fail with a SQL `SyntaxError`. @count = @data.except(:select).count @page_size = self._page_size @total_pages = @count / @page_size @total_pages += 1 if @count % @page_size != 0 end |
Instance Method Details
#_page_size ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/rest_framework/paginators/page_number_paginator.rb', line 15 def _page_size page_size = nil # Get from context, if allowed. if @controller.page_size_query_param if page_size = @controller.params[@controller.page_size_query_param].presence page_size = page_size.to_i end end # Otherwise, get from config. if !page_size && @controller.page_size page_size = @controller.page_size end # Ensure we don't exceed the max page size. if @controller.max_page_size && page_size > @controller.max_page_size page_size = @controller.max_page_size end # Ensure we return at least 1. return page_size.zero? ? 1 : page_size end |
#get_page(page_number = nil) ⇒ Object
Get the page and return it so the caller can serialize it.
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/rest_framework/paginators/page_number_paginator.rb', line 40 def get_page(page_number=nil) # If page number isn't provided, infer from the params or use 1 as a fallback value. unless page_number page_number = @controller&.params&.[](@controller.page_query_param&.to_sym) if page_number.blank? page_number = 1 else page_number = page_number.to_i if page_number.zero? page_number = 1 end end end @page_number = page_number # Get the data page and return it so the caller can serialize the data in the proper format. page_index = @page_number - 1 return @data.limit(@page_size).offset(page_index * @page_size) end |
#get_paginated_response(serialized_page) ⇒ Object
Wrap the serialized page with appropriate metadata. TODO: include links.
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/rest_framework/paginators/page_number_paginator.rb', line 61 def get_paginated_response(serialized_page) page_query_param = @controller.page_query_param base_params = @controller.params.to_unsafe_h next_url = if @page_number < @total_pages @controller.url_for({**base_params, page_query_param => @page_number + 1}) end previous_url = if @page_number > 1 @controller.url_for({**base_params, page_query_param => @page_number - 1}) end return { count: @count, page: @page_number, page_size: @page_size, total_pages: @total_pages, next: next_url, previous: previous_url, results: serialized_page, }.compact end |