aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/arel/select_manager.rb10
-rw-r--r--lib/arel/visitors/dot.rb7
-rw-r--r--spec/arel/select_manager_spec.rb16
3 files changed, 33 insertions, 0 deletions
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,9 +63,25 @@ 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"
ON "users"."id" = "users_2"."id"
}