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:
parent
40f31b6f5e
commit
9f9b32544d
3 changed files with 33 additions and 0 deletions
|
@ -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.
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in a new issue