Class: OrderQuery::Space

Inherits:
Object
  • Object
show all
Defined in:
lib/order_query/space.rb

Overview

Order specification and a scope

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base_scope, order_spec) ⇒ Space

Returns a new instance of Space.

Parameters:

  • base_scope (ActiveRecord::Relation)
  • order_spec (Array<Array<Symbol,String>>, OrderQuery::Spec)


11
12
13
14
15
16
17
18
19
20
# File 'lib/order_query/space.rb', line 11

def initialize(base_scope, order_spec)
  @base_scope   = base_scope
  @columns   = order_spec.map { |cond_spec| Column.new(cond_spec, base_scope) }
  # add primary key if columns are not unique
  unless @columns.last.unique?
    raise ArgumentError.new('Unique column must be last') if @columns.detect(&:unique?)
    @columns << Column.new([base_scope.primary_key], base_scope)
  end
  @order_by_sql = SQL::OrderBy.new(@columns)
end

Instance Attribute Details

#columnsArray<OrderQuery::Column> (readonly)

Returns:



7
8
9
# File 'lib/order_query/space.rb', line 7

def columns
  @columns
end

Instance Method Details

#at(record) ⇒ Point

Returns:



23
24
25
# File 'lib/order_query/space.rb', line 23

def at(record)
  Point.new(record, self)
end

#firstActiveRecord::Base

Returns:

  • (ActiveRecord::Base)


38
39
40
# File 'lib/order_query/space.rb', line 38

def first
  scope.first
end

#inspectObject



49
50
51
# File 'lib/order_query/space.rb', line 49

def inspect
  "#<OrderQuery::Space @columns=#{@columns.inspect} @base_scope=#{@base_scope.inspect}>"
end

#lastActiveRecord::Base

Returns:

  • (ActiveRecord::Base)


43
44
45
# File 'lib/order_query/space.rb', line 43

def last
  scope_reverse.first
end

#scopeActiveRecord::Relation

Returns scope ordered by columns.

Returns:

  • (ActiveRecord::Relation)

    scope ordered by columns



28
29
30
# File 'lib/order_query/space.rb', line 28

def scope
  @scope ||= @base_scope.order(@order_by_sql.build)
end

#scope_reverseActiveRecord::Relation

Returns scope ordered by columns in reverse.

Returns:

  • (ActiveRecord::Relation)

    scope ordered by columns in reverse



33
34
35
# File 'lib/order_query/space.rb', line 33

def scope_reverse
  @scope_reverse ||= @base_scope.order(@order_by_sql.build_reverse)
end