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