aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2010-09-07 17:42:40 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2010-09-07 17:42:40 -0700
commitb4bcb93276834448ad9b59e91793ad75da26ce87 (patch)
treea22aff7829d55be9570c89fe1868f16467029e2c
parent49432b11c1e0ebd2c5ac0d1d673a2ea9e8799d39 (diff)
downloadrails-b4bcb93276834448ad9b59e91793ad75da26ce87.tar.gz
rails-b4bcb93276834448ad9b59e91793ad75da26ce87.tar.bz2
rails-b4bcb93276834448ad9b59e91793ad75da26ce87.zip
on can take multiple args
-rw-r--r--lib/arel/select_manager.rb15
-rw-r--r--spec/arel/select_manager_spec.rb39
2 files changed, 52 insertions, 2 deletions
diff --git a/lib/arel/select_manager.rb b/lib/arel/select_manager.rb
index 2ad9555d27..d8e113d5ee 100644
--- a/lib/arel/select_manager.rb
+++ b/lib/arel/select_manager.rb
@@ -8,8 +8,8 @@ module Arel
@ctx = @head.cores.last
end
- def on expr
- @ctx.froms.last.constraint = Nodes::On.new(expr)
+ def on *exprs
+ @ctx.froms.last.constraint = Nodes::On.new(collapse(exprs))
self
end
@@ -89,5 +89,16 @@ module Arel
def to_a
raise NotImplementedError
end
+
+ private
+ def collapse exprs
+ return exprs.first if exprs.length == 1
+
+ right = exprs.pop
+ left = exprs.pop
+
+ right = Nodes::And.new left, right
+ exprs.reverse.inject(right) { |memo,expr| Nodes::And.new(expr, memo) }
+ end
end
end
diff --git a/spec/arel/select_manager_spec.rb b/spec/arel/select_manager_spec.rb
index 506abb6485..335d044feb 100644
--- a/spec/arel/select_manager_spec.rb
+++ b/spec/arel/select_manager_spec.rb
@@ -56,6 +56,45 @@ module Arel
end
end
+ describe 'on' do
+ it 'takes two params' 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).on(predicate, predicate)
+ manager.to_sql.should be_like %{
+ SELECT FROM "users"
+ INNER JOIN "users" "users_2"
+ ON "users"."id" = "users_2"."id" AND
+ "users"."id" = "users_2"."id"
+ }
+ end
+
+ it 'takes three params' 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).on(
+ predicate,
+ predicate,
+ left[:name].eq(right[:name])
+ )
+ manager.to_sql.should be_like %{
+ SELECT FROM "users"
+ INNER JOIN "users" "users_2"
+ ON "users"."id" = "users_2"."id" AND
+ "users"."id" = "users_2"."id" AND
+ "users"."name" = "users_2"."name"
+ }
+ end
+ end
+
describe 'join' do
it 'responds to join' do
left = Table.new :users