module CursorPagination::ActiveRecordModelExtension

Public Class Methods

_origin_scope() click to toggle source
# File lib/cursor_pagination/active_record_model_extension.rb, line 12
def self._origin_scope
  @origin_scope
end
current_cursor() click to toggle source
# File lib/cursor_pagination/active_record_model_extension.rb, line 8
def self.current_cursor
  @current_cursor
end
cursor(cursor, options = {}) click to toggle source
# File lib/cursor_pagination/active_record_model_extension.rb, line 20
def self.cursor(cursor, options = {})
  cursor = Cursor.decode(cursor) unless cursor.is_a? Cursor

  options.reverse_merge! column: :id, reverse: false, columns: {}
  if options[:columns].empty?
    options[:columns][options[:column]] = { reverse: options[:reverse] }
  end

  scoped_method = ActiveRecord::VERSION::STRING < '4.0' ? :scoped : :all
  @current_cursor = cursor
  @origin_scope = self.send scoped_method
  @cursor_options = options

  scope = @origin_scope
  unless cursor.empty?
    cursor_value = [*cursor.value]
    scope = scope.where _cursor_to_where(options[:columns], cursor_value)
  end
  scope = scope.limit(25)

  scope.extending(CursorPagination::PageScopeMethods)
end
cursor_options() click to toggle source
# File lib/cursor_pagination/active_record_model_extension.rb, line 16
def self.cursor_options
  @cursor_options
end

Private Class Methods

_cursor_to_where(columns, cursor, reverse = false) click to toggle source
# File lib/cursor_pagination/active_record_model_extension.rb, line 44
def self._cursor_to_where(columns, cursor, reverse = false)
  _cursor_to_where_recursion(0, arel_table, columns.to_a, cursor, reverse)
end
_cursor_to_where_recursion(i, t, columns, cursor, reverse = false) click to toggle source
# File lib/cursor_pagination/active_record_model_extension.rb, line 48
def self._cursor_to_where_recursion(i, t, columns, cursor, reverse = false)
  column = columns[i]
  method = column.last[:reverse] ? :lt : :gt
  method = (method == :lt ? :gt : :lt) if reverse
  if (columns.size - i) == 1 #last column
    method = (method == :lt ? :lteq : :gteq) if reverse
    t[column.first].send method, cursor[i]
  else
    t[column.first].send(method, cursor[i]).or(t[column.first].eq(cursor[i]).and(_cursor_to_where_recursion(i+1, t, columns, cursor, reverse)))
  end
end