Class: ActiveModel::Relation::OrderClause

Inherits:
Object
  • Object
show all
Defined in:
lib/active_model/relation/order_clause.rb

Defined Under Namespace

Classes: Ascending, Descending, OrderExpression

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*expressions) ⇒ OrderClause

Returns a new instance of OrderClause.



62
63
64
# File 'lib/active_model/relation/order_clause.rb', line 62

def initialize(*expressions)
  @expressions = expressions.flatten(1)
end

Instance Attribute Details

#expressionsObject (readonly)

Returns the value of attribute expressions.



26
27
28
# File 'lib/active_model/relation/order_clause.rb', line 26

def expressions
  @expressions
end

Class Method Details

.build(value = []) ⇒ Object



28
29
30
31
32
33
34
35
36
# File 'lib/active_model/relation/order_clause.rb', line 28

def self.build(value = [])
  if value.is_a?(Array)
    from_array(value)
  elsif value.is_a?(Hash)
    from_hash(value)
  else
    from_value(value)
  end
end

.from_array(attributes) ⇒ Object



42
43
44
45
46
# File 'lib/active_model/relation/order_clause.rb', line 42

def self.from_array(attributes)
  expressions = attributes.map { |name| build(name) }

  new(expressions)
end

.from_hash(attributes) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/active_model/relation/order_clause.rb', line 48

def self.from_hash(attributes)
  expressions = attributes.map do |name, direction|
    if direction == :asc
      Ascending.new(name)
    elsif direction == :desc
      Descending.new(name)
    else
      raise ArgumentError, "Invalid direction #{direction.inspect}. Direction should either be :asc or :desc."
    end
  end

  new(expressions)
end

.from_value(value) ⇒ Object



38
39
40
# File 'lib/active_model/relation/order_clause.rb', line 38

def self.from_value(value)
  new(Ascending.new(value))
end

Instance Method Details

#+(other) ⇒ Object



66
67
68
# File 'lib/active_model/relation/order_clause.rb', line 66

def +(other)
  OrderClause.new(@expressions + other.expressions)
end

#call(record, other) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
# File 'lib/active_model/relation/order_clause.rb', line 70

def call(record, other)
  return 0 if expressions.empty?

  expressions.each do |expression|
    result = expression.call(record, other)

    return result unless result.zero?
  end

  0
end

#to_procObject



82
83
84
# File 'lib/active_model/relation/order_clause.rb', line 82

def to_proc
  method(:call).to_proc
end