From b4bcb93276834448ad9b59e91793ad75da26ce87 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 7 Sep 2010 17:42:40 -0700 Subject: on can take multiple args --- lib/arel/select_manager.rb | 15 +++++++++++++-- spec/arel/select_manager_spec.rb | 39 +++++++++++++++++++++++++++++++++++++++ 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 -- cgit v1.2.3