aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/arel/select_manager.rb15
1 files changed, 13 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