module Nextable

This module adds records that allow sane comparisons of values, mostly in the realm of downcasing string fields.

Public Instance Methods

next_record(opts = {}) click to toggle source
# File lib/nextable.rb, line 19
def next_record(opts = {})
  initialize!(opts)
  return pick_next_record if @field == 'id'
  pick_next_record_for_field
end
previous_record(opts = {}) click to toggle source
# File lib/nextable.rb, line 25
def previous_record(opts = {})
  initialize!(opts)
  return pick_previous_record if @field == 'id'
  pick_previous_record_for_field
end

Private Instance Methods

by_field() click to toggle source

Ordering helpers

# File lib/nextable.rb, line 118
def by_field
  return "lower(#{@field}) asc" if field_is_string?
  "#{@field} asc"
end
by_field_desc() click to toggle source
# File lib/nextable.rb, line 123
def by_field_desc
  return "lower(#{@field}) desc" if field_is_string?
  "#{@field} desc"
end
field_is_nil_next() click to toggle source
# File lib/nextable.rb, line 52
def field_is_nil_next
  if self.send(@field).nil?
    next_nil || first_non_nil.order(by_field).first
  end
end
field_is_nil_prev() click to toggle source
# File lib/nextable.rb, line 89
def field_is_nil_prev
  if self.send(@field).nil?
    prev_nil || last_non_nil.order(by_desc_field).first
  end
end
field_not_nil_next() click to toggle source
# File lib/nextable.rb, line 58
def field_not_nil_next
  rel = greater_ids.presence || greater_fields.presence ||
    (first_of_field if @cycle).presence
  rel.order(:id).first unless rel.nil?
end
field_not_nil_prev() click to toggle source
# File lib/nextable.rb, line 95
def field_not_nil_prev
  rel = lesser_ids.presence || lesser_fields.presence ||
    (last_of_field if @cycle).presence
  rel.order(id: :desc).first unless rel.nil?
end
first_of_field() click to toggle source
# File lib/nextable.rb, line 72
def first_of_field
  @scope.order(by_field)
end
greater_fields() click to toggle source
# File lib/nextable.rb, line 68
def greater_fields
  @scope.where(greater_field_params).order(by_field)
end
greater_ids() click to toggle source
# File lib/nextable.rb, line 64
def greater_ids
  @scope.where(greater_id_params)
end
initialize!(options) click to toggle source
# File lib/nextable.rb, line 33
def initialize!(options)
  @field = options.fetch(:field, 'id')
  @cycle = options.fetch(:cycle, false)
  @scope = self.class.where(options[:filters])
end
last_of_field() click to toggle source
# File lib/nextable.rb, line 110
def last_of_field
  @scope.order(by_field_desc)
end
lesser_fields() click to toggle source
# File lib/nextable.rb, line 105
def lesser_fields
  @scope.where(lesser_field_params).order(by_field_desc).presence ||
    @scope.where("? IS NULL", @field).presence
end
lesser_ids() click to toggle source
# File lib/nextable.rb, line 101
def lesser_ids
  @scope.where(lesser_id_params)
end
pick_next_record() click to toggle source

next_record methods

# File lib/nextable.rb, line 43
def pick_next_record
  @scope.where("id > ?", id).order(:id).first ||
    (@scope.order(:id).first if @cycle)
end
pick_next_record_for_field() click to toggle source
# File lib/nextable.rb, line 48
def pick_next_record_for_field
  field_is_nil_next || field_not_nil_next
end
pick_previous_record() click to toggle source

previous_record methods

# File lib/nextable.rb, line 80
def pick_previous_record
  @scope.where("id < ?", id).order(id: :desc).first ||
    (@scope.order(id: :desc).first if @cycle)
end
pick_previous_record_for_field() click to toggle source
# File lib/nextable.rb, line 85
def pick_previous_record_for_field
  field_is_nil_prev || field_not_nil_prev
end