diff --git a/lib/arel/select_manager.rb b/lib/arel/select_manager.rb index c8cd37b9fa..b574253b05 100644 --- a/lib/arel/select_manager.rb +++ b/lib/arel/select_manager.rb @@ -18,6 +18,16 @@ module Arel self 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 # FIXME: converting these to SQLLiterals is probably not good, but # rails tests require it. diff --git a/lib/arel/visitors/dot.rb b/lib/arel/visitors/dot.rb index f66dfd8a54..73fcddca84 100644 --- a/lib/arel/visitors/dot.rb +++ b/lib/arel/visitors/dot.rb @@ -28,6 +28,12 @@ module Arel end 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 visit_edge o, "expressions" visit_edge o, "distinct" @@ -37,6 +43,7 @@ module Arel visit_edge o, "left" visit_edge o, "right" end + alias :visit_Arel_Nodes_InnerJoin :visit_Arel_Nodes_StringJoin def visit_Arel_Nodes_InsertStatement o visit_edge o, "relation" diff --git a/spec/arel/select_manager_spec.rb b/spec/arel/select_manager_spec.rb index f894d3230a..800018aa7d 100644 --- a/spec/arel/select_manager_spec.rb +++ b/spec/arel/select_manager_spec.rb @@ -63,7 +63,23 @@ module Arel predicate = left[:id].eq(right[:id]) manager = Arel::SelectManager.new Table.engine + manager.from left 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 %{ SELECT FROM "users" OUTER JOIN "users" "users_2"