class ParamsReady::Ordering::Column

Constants

DIRECTIONS
NULLS_FIRST
NULLS_LAST

Attributes

nulls[R]
ordering[R]
pk[R]
required[R]
table[R]

Public Class Methods

new(ordering, arel_table:, expression:, nulls: :default, required: false, pk: false) click to toggle source
# File lib/params_ready/ordering/column.rb, line 14
def initialize(ordering, arel_table:, expression:, nulls: :default, required: false, pk: false)
  raise ParamsReadyError, "Invalid ordering value: #{ordering}" unless DIRECTIONS.include? ordering
  @ordering = ordering
  @table = arel_table
  @expression = expression
  @nulls = nulls
  @required = required
  @pk = pk
end

Public Instance Methods

attribute(name, default_table, context) click to toggle source
# File lib/params_ready/ordering/column.rb, line 28
def attribute(name, default_table, context)
  arel_table = table || default_table
  arel_builder = Helpers::ArelBuilder.instance(expression(name), arel_table: arel_table)
  arel_builder.to_arel(arel_table, context, self)
end
clauses(attribute, direction, inverted: false) click to toggle source
# File lib/params_ready/ordering/column.rb, line 34
def clauses(attribute, direction, inverted: false)
  clause = attribute.send direction
  if nulls == :default
    [clause]
  else
    values = null_substitution_values(nulls, inverted)

    nulls_last = Arel::Nodes::Case.new
      .when(attribute.eq(nil)).then(values[:null])
      .else(values[:not_null])
    [nulls_last, clause]
  end
end
expression(name) click to toggle source
# File lib/params_ready/ordering/column.rb, line 24
def expression(name)
  @expression || name
end
null_substitution_values(policy, inverted) click to toggle source
# File lib/params_ready/ordering/column.rb, line 48
def null_substitution_values(policy, inverted)
  case [policy, inverted]
  when [:first, false], [:last, true]
    NULLS_FIRST
  when [:last, false], [:first, true]
    NULLS_LAST
  else
    raise ParamsReadyError, "Unimplemented null handling policy: '#{nulls}' (inverted: #{inverted})"
  end
end