@@ -11,7 +11,7 @@ def hash
1111 expr . hash
1212 end
1313 def ==( other )
14- self . class == other . class && self . expr == other . expr
14+ other . is_a? ( Arel :: Nodes :: Ordering ) && self . expr == other . expr
1515 end
1616 def eql? ( other )
1717 self == other
@@ -27,26 +27,25 @@ class SelectManager < Arel::TreeManager
2727 # to grouping objects for the inner sql during a select statment with an offset/rownumber. So this
2828 # is here till ActiveRecord & ARel does this for us instead of using SqlLiteral objects.
2929 alias :order_without_sqlserver :order
30- def order ( *exprs )
31- return order_without_sqlserver ( *exprs ) unless Arel ::Visitors ::SQLServer === @visitor
32- @ast . orders . concat ( exprs . map { |x |
30+ def order ( *expr )
31+ return order_without_sqlserver ( *expr ) unless Arel ::Visitors ::SQLServer === @visitor
32+ @ast . orders . concat ( expr . map { |x |
3333 case x
3434 when Arel ::Attributes ::Attribute
3535 table = Arel ::Table . new ( x . relation . table_alias || x . relation . name )
36- expr = table [ x . name ]
37- Arel ::Nodes ::Ordering . new expr
36+ e = table [ x . name ]
37+ Arel ::Nodes ::Ascending . new e
3838 when Arel ::Nodes ::Ordering
3939 x
4040 when String
4141 x . split ( ',' ) . map do |s |
42- expr , direction = s . split
43- expr = Arel . sql ( expr )
44- direction = direction =~ /desc/i ? :desc : :asc
45- Arel ::Nodes ::Ordering . new expr , direction
42+ e , d = s . split
43+ e = Arel . sql ( e )
44+ d =~ /desc/i ? Arel ::Nodes ::Descending . new ( e ) : Arel ::Nodes ::Ascending . new ( e )
4645 end
4746 else
48- expr = Arel . sql ( x . to_s )
49- Arel ::Nodes ::Ordering . new expr
47+ e = Arel . sql ( x . to_s )
48+ Arel ::Nodes ::Ascending . new e
5049 end
5150 } . flatten )
5251 self
@@ -101,7 +100,17 @@ def visit_Arel_Nodes_Limit(o)
101100 def visit_Arel_Nodes_Lock ( o )
102101 visit o . expr
103102 end
104-
103+
104+ # FIXME: Only needed due to this problem found in 2.1.3
105+ # Grepping The AST Can Lead To Problems - https://github.com/rails/arel/issues/66
106+ def visit_Arel_Nodes_Ordering ( o )
107+ if o . respond_to? ( :direction )
108+ "#{ visit o . expr } #{ o . ascending? ? 'ASC' : 'DESC' } "
109+ else
110+ visit o . expr
111+ end
112+ end
113+
105114 def visit_Arel_Nodes_Bin ( o )
106115 "#{ visit o . expr } #{ @engine . connection . cs_equality_operator } "
107116 end
0 commit comments