class CursorPager::SliceRelation

Applies after and before cursors to a relation.

Attributes

after_values[R]
base_relation[R]
before_values[R]
order_values[R]

Public Class Methods

new(base_relation, order_values, after_values, before_values) click to toggle source
# File lib/cursor_pager/slice_relation.rb, line 8
def initialize(base_relation, order_values, after_values, before_values)
  @base_relation = base_relation
  @order_values = order_values
  @after_values = after_values
  @before_values = before_values
end

Public Instance Methods

call() click to toggle source
# File lib/cursor_pager/slice_relation.rb, line 15
def call
  relation = base_relation

  relation = apply_after(relation)
  relation = apply_before(relation)

  relation
end

Private Instance Methods

apply_after(relation) click to toggle source
# File lib/cursor_pager/slice_relation.rb, line 26
def apply_after(relation)
  return relation if after_values.blank?

  if order_values.direction == :asc
    slice_relation(relation, ">", after_values)
  else
    slice_relation(relation, "<", after_values)
  end
end
apply_before(relation) click to toggle source
# File lib/cursor_pager/slice_relation.rb, line 36
def apply_before(relation)
  return relation if before_values.blank?

  if order_values.direction == :asc
    slice_relation(relation, "<", before_values)
  else
    slice_relation(relation, ">", before_values)
  end
end
slice_relation(relation, operator, value) click to toggle source
# File lib/cursor_pager/slice_relation.rb, line 46
def slice_relation(relation, operator, value)
  slice_attribute = order_values.map(&:prefixed_attribute).join(", ")

  relation.where("(#{slice_attribute}) #{operator} (?)", value)
end