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:

  • spec (Hash)

    a customizable set of options

Options Hash (spec):

  • :unique (String)

    Mark the attribute as unique to avoid redundant columns



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

def initialize(spec, scope)
  spec    = spec.dup
  options = spec.extract_options!
  @name   = spec[0]
  case spec[1]
    when Array
      @order_enum = spec[1]
      @order      = spec[2] || :desc
    else
      @order = spec[1] || :asc
  end
  @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.



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

def name
  @name
end

#optionsObject (readonly)

Returns the value of attribute options.



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

def options
  @options
end

#orderObject (readonly)

Returns the value of attribute order.



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

def order
  @order
end

#order_enumObject (readonly)

Returns the value of attribute order_enum.



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

def order_enum
  @order_enum
end

Instance Method Details

#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:

  • value (Object)
  • side (:before, :after)

Returns:

  • (Array)

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



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/order_query/column.rb', line 39

def enum_side(value, side, strict = true)
  ord = order_enum
  pos = ord.index(value)
  if pos
    dir = order
    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



55
56
57
58
59
60
61
62
63
64
# File 'lib/order_query/column.rb', line 55

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

#unique?Boolean

Returns:

  • (Boolean)


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

def unique?
  @unique
end