1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

on can take multiple args

This commit is contained in:
Aaron Patterson 2010-09-07 17:42:40 -07:00
parent 49432b11c1
commit b4bcb93276
2 changed files with 52 additions and 2 deletions

View file

@ -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

View file

@ -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