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

getting better on joins

This commit is contained in:
Aaron Patterson 2010-09-07 15:10:27 -07:00
parent 40f31b6f5e
commit 9f9b32544d
3 changed files with 33 additions and 0 deletions

View file

@ -18,6 +18,16 @@ module Arel
self self
end end
def join relation, klass = Nodes::InnerJoin
case relation
when String, Nodes::SqlLiteral
raise if relation.blank?
from Nodes::StringJoin.new(@ctx.froms.pop, relation)
else
from klass.new(@ctx.froms.pop, relation, nil)
end
end
def project *projections def project *projections
# FIXME: converting these to SQLLiterals is probably not good, but # FIXME: converting these to SQLLiterals is probably not good, but
# rails tests require it. # rails tests require it.

View file

@ -28,6 +28,12 @@ module Arel
end end
private private
def visit_Arel_Nodes_TableAlias o
visit_edge o, "name"
visit_edge o, "relation"
visit_edge o, "columns"
end
def visit_Arel_Nodes_Count o def visit_Arel_Nodes_Count o
visit_edge o, "expressions" visit_edge o, "expressions"
visit_edge o, "distinct" visit_edge o, "distinct"
@ -37,6 +43,7 @@ module Arel
visit_edge o, "left" visit_edge o, "left"
visit_edge o, "right" visit_edge o, "right"
end end
alias :visit_Arel_Nodes_InnerJoin :visit_Arel_Nodes_StringJoin
def visit_Arel_Nodes_InsertStatement o def visit_Arel_Nodes_InsertStatement o
visit_edge o, "relation" visit_edge o, "relation"

View file

@ -63,7 +63,23 @@ module Arel
predicate = left[:id].eq(right[:id]) predicate = left[:id].eq(right[:id])
manager = Arel::SelectManager.new Table.engine manager = Arel::SelectManager.new Table.engine
manager.from left
manager.join(right).on(predicate) manager.join(right).on(predicate)
manager.to_sql.should be_like %{
SELECT FROM "users"
INNER JOIN "users" "users_2"
ON "users"."id" = "users_2"."id"
}
end
it 'takes a class' do
left = Table.new :users
right = left.alias
predicate = left[:id].eq(right[:id])
manager = Arel::SelectManager.new Table.engine
manager.from left
manager.join(right, Nodes::OuterJoin).on(predicate)
manager.to_sql.should be_like %{ manager.to_sql.should be_like %{
SELECT FROM "users" SELECT FROM "users"
OUTER JOIN "users" "users_2" OUTER JOIN "users" "users_2"