1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Support Attribute#asc and Attribute#desc to create orderings

This commit is contained in:
Ernie Miller 2010-09-29 20:08:57 -04:00
parent f5b76c220e
commit eef61ab909
7 changed files with 78 additions and 0 deletions

View file

@ -151,6 +151,14 @@ module Arel
grouping_all :lteq, others
end
def asc
Nodes::Ordering.new self, :asc
end
def desc
Nodes::Ordering.new self, :desc
end
private
def grouping_any method_id, others

View file

@ -15,6 +15,7 @@ require 'arel/nodes/does_not_match'
require 'arel/nodes/in'
require 'arel/nodes/not_in'
require 'arel/nodes/ordering'
require 'arel/nodes/lock'
require 'arel/nodes/function'
require 'arel/nodes/count'

View file

@ -0,0 +1,19 @@
module Arel
module Nodes
class Ordering < Arel::Nodes::Node
attr_accessor :expr, :direction
def initialize expression, direction = :asc
@expr, @direction = expression, direction
end
def ascending?
direction == :asc
end
def descending?
direction == :desc
end
end
end
end

View file

@ -32,6 +32,11 @@ module Arel
visit_edge o, "expr"
end
def visit_Arel_Nodes_Ordering o
visit_edge o, "expr"
visit_edge o, "direction"
end
def visit_Arel_Nodes_TableAlias o
visit_edge o, "name"
visit_edge o, "relation"

View file

@ -107,6 +107,10 @@ module Arel
"(#{visit o.expr})"
end
def visit_Arel_Nodes_Ordering o
"#{visit o.expr} #{o.descending? ? 'DESC' : 'ASC'}"
end
def visit_Arel_Nodes_Group o
visit o.expr
end

View file

@ -601,6 +601,38 @@ module Arel
}
end
end
describe '#asc' do
it 'should create an Ordering node' do
relation = Table.new(:users)
relation[:id].asc.should be_kind_of Nodes::Ordering
end
it 'should generate ASC in sql' do
relation = Table.new(:users)
mgr = relation.project relation[:id]
mgr.order relation[:id].asc
mgr.to_sql.should be_like %{
SELECT "users"."id" FROM "users" ORDER BY "users"."id" ASC
}
end
end
describe '#desc' do
it 'should create an Ordering node' do
relation = Table.new(:users)
relation[:id].desc.should be_kind_of Nodes::Ordering
end
it 'should generate DESC in sql' do
relation = Table.new(:users)
mgr = relation.project relation[:id]
mgr.order relation[:id].desc
mgr.to_sql.should be_like %{
SELECT "users"."id" FROM "users" ORDER BY "users"."id" DESC
}
end
end
end
describe 'equality' do

View file

@ -66,6 +66,15 @@ module Arel
@visitor.accept(test).should be_like %{ "users"."id" = 't' }
end
describe "Nodes::Ordering" do
it "should know how to visit" do
node = @attr.desc
@visitor.accept(node).should be_like %{
"users"."id" DESC
}
end
end
describe "Nodes::In" do
it "should know how to visit" do
node = @attr.in [1, 2, 3]