class OrderQuery::Space
Order specification and a scope
Attributes
columns[R]
@return [Array<OrderQuery::Column>]
Public Class Methods
new(base_scope, order_spec)
click to toggle source
@param [ActiveRecord::Relation] base_scope @param [Array<Array<Symbol,String>>] order_spec @see Column#initialize for the order_spec element format.
# File lib/order_query/space.rb, line 15 def initialize(base_scope, order_spec) @base_scope = base_scope @columns = order_spec.map(&:clone) @columns.map! do |cond_spec| build_column(base_scope, cond_spec) end # add primary key if columns are not unique unless @columns.last.unique? if @columns.detect(&:unique?) fail ArgumentError, 'Unique column must be last' end @columns << Column.new(base_scope, base_scope.primary_key) end @order_by_sql = SQL::OrderBy.new(@columns) end
Public Instance Methods
at(record)
click to toggle source
@return [Point]
# File lib/order_query/space.rb, line 33 def at(record) Point.new(record, self) end
first()
click to toggle source
@return [ActiveRecord::Base]
# File lib/order_query/space.rb, line 49 def first scope.first end
inspect()
click to toggle source
# File lib/order_query/space.rb, line 58 def inspect "#<OrderQuery::Space @columns=#{@columns.inspect} "\ "@base_scope=#{@base_scope.inspect}>" end
last()
click to toggle source
@return [ActiveRecord::Base]
# File lib/order_query/space.rb, line 54 def last scope_reverse.first end
scope()
click to toggle source
@return [ActiveRecord::Relation] scope ordered by columns
# File lib/order_query/space.rb, line 38 def scope @scope ||= @base_scope.order(Arel.sql(@order_by_sql.build)) end
scope_reverse()
click to toggle source
@return [ActiveRecord::Relation] scope ordered by columns in reverse
# File lib/order_query/space.rb, line 43 def scope_reverse @scope_reverse ||= @base_scope .order(Arel.sql(@order_by_sql.build_reverse)) end
Private Instance Methods
build_column(base_scope, cond_spec)
click to toggle source
# File lib/order_query/space.rb, line 65 def build_column(base_scope, cond_spec) column_spec = cond_spec.last.is_a?(Hash) ? cond_spec : cond_spec.push({}) attr_name, *vals_and_or_dir, options = column_spec Column.new(base_scope, attr_name, *vals_and_or_dir, **options) end