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