class CursorPager::LimitRelation
Applies first and last limits to a relation.
Attributes
base_relation[R]
first[R]
last[R]
Public Class Methods
new(base_relation, first, last)
click to toggle source
# File lib/cursor_pager/limit_relation.rb, line 8 def initialize(base_relation, first, last) @base_relation = base_relation @first = first @last = last end
Public Instance Methods
call()
click to toggle source
# File lib/cursor_pager/limit_relation.rb, line 14 def call relation = base_relation relation = apply_first(relation) if first.present? relation = apply_last(relation) if last.present? relation end
Private Instance Methods
apply_first(relation)
click to toggle source
Apply first if it sets a stricter limit than the one already applied
# File lib/cursor_pager/limit_relation.rb, line 26 def apply_first(relation) previous_limit = relation.limit_value if previous_limit.nil? || previous_limit > first relation.limit(first) else relation end end
apply_last(relation)
click to toggle source
Apply last if it's a smaller slice than the previous limit
# File lib/cursor_pager/limit_relation.rb, line 37 def apply_last(relation) previous_limit = relation.limit_value if previous_limit.present? if last <= previous_limit relation = apply_stricter_last(relation, previous_limit) end else relation = apply_last_withouth_previous_limit(relation) end relation end
apply_last_withouth_previous_limit(relation)
click to toggle source
# File lib/cursor_pager/limit_relation.rb, line 57 def apply_last_withouth_previous_limit(relation) count = base_relation.size previous_offset = relation.offset_value || 0 offset = previous_offset + count - [last, count].min relation.offset(offset).limit(last) end
apply_stricter_last(relation, previous_limit)
click to toggle source
# File lib/cursor_pager/limit_relation.rb, line 51 def apply_stricter_last(relation, previous_limit) offset = (relation.offset_value || 0) + (previous_limit - last) relation.offset(offset).limit(last) end