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:
parent
49432b11c1
commit
b4bcb93276
2 changed files with 52 additions and 2 deletions
|
@ -8,8 +8,8 @@ module Arel
|
||||||
@ctx = @head.cores.last
|
@ctx = @head.cores.last
|
||||||
end
|
end
|
||||||
|
|
||||||
def on expr
|
def on *exprs
|
||||||
@ctx.froms.last.constraint = Nodes::On.new(expr)
|
@ctx.froms.last.constraint = Nodes::On.new(collapse(exprs))
|
||||||
self
|
self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -89,5 +89,16 @@ module Arel
|
||||||
def to_a
|
def to_a
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
end
|
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
|
||||||
end
|
end
|
||||||
|
|
|
@ -56,6 +56,45 @@ module Arel
|
||||||
end
|
end
|
||||||
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
|
describe 'join' do
|
||||||
it 'responds to join' do
|
it 'responds to join' do
|
||||||
left = Table.new :users
|
left = Table.new :users
|
||||||
|
|
Loading…
Reference in a new issue