Class: OrderQuery::Column

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

Overview

An order column (sort column)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(spec, scope) ⇒ Column

Returns a new instance of Column.

Parameters:

  • a customizable set of options

Options Hash (spec):

  • :unique (String)

    Mark the attribute as unique to avoid redundant columns



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/order_query/column.rb', line 11

def initialize(spec, scope)
  spec       = spec.dup
  options    = spec.extract_options!
  @name      = spec[0]
  if spec[1].is_a?(Array)
    @order_enum = spec.delete_at(1)
    spec[1] ||= :desc
  end
  @direction = Direction.parse!(spec[1] || :asc)
  @options   = options.reverse_merge(
      unique:   name.to_s == scope.primary_key,
      complete: true
  )
  @unique    = @options[:unique]
  @sql       = SQL::Column.new(self, scope)
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



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

def name
  @name
end

#optionsObject (readonly)

Returns the value of attribute options.



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

def options
  @options
end

#order_enumObject (readonly)

Returns the value of attribute order_enum.



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

def order_enum
  @order_enum
end

Instance Method Details

#direction(reverse = false) ⇒ Object



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

def direction(reverse = false)
  reverse ? Direction.reverse(@direction) : @direction
end

#enum_side(value, side, strict = true) ⇒ Array

Returns valid order values before / after passed (depending on the side).

Examples:

for [:difficulty, [‘Easy’, ‘Normal’, ‘Hard’]]:

enum_side('Normal', :after) #=> ['Hard']
enum_side('Normal', :after, false) #=> ['Normal', 'Hard']

Parameters:

Returns:

  • valid order values before / after passed (depending on the side)



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/order_query/column.rb', line 42

def enum_side(value, side, strict = true)
  ord = order_enum
  pos = ord.index(value)
  if pos
    dir = direction
    if side == :after && dir == :desc || side == :before && dir == :asc
      ord.from pos + (strict ? 1 : 0)
    else
      ord.first pos + (strict ? 0 : 1)
    end
  else
    # default to all if current is not in sort order values
    []
  end
end

#inspectObject



58
59
60
61
62
63
64
65
66
67
# File 'lib/order_query/column.rb', line 58

def inspect
  parts = [
      @name,
      (@order_enum.inspect if order_enum),
      ('unique' if @unique),
      (column_name if options[:sql]),
      @direction
  ].compact
  "(#{parts.join(' ')})"
end

#unique?Boolean

Returns:



32
33
34
# File 'lib/order_query/column.rb', line 32

def unique?
  @unique
end