From 29b8ebd187e0888d5e71b2e1e4a12334860bc76c Mon Sep 17 00:00:00 2001 From: Olivier Favre Date: Fri, 3 Aug 2012 14:26:15 +0200 Subject: [PATCH] ActiveRecord::Relation unions [PROPOSAL], closes #939 Depends on rails/arel#118. The accepted implementation could act as a unions list, or a new top-level object, which would change this patch proposal. --- .../active_record/relation/query_methods.rb | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb index fab2cd77f0fa6..2428897c85d44 100644 --- a/activerecord/lib/active_record/relation/query_methods.rb +++ b/activerecord/lib/active_record/relation/query_methods.rb @@ -6,7 +6,7 @@ module QueryMethods extend ActiveSupport::Concern attr_accessor :includes_values, :eager_load_values, :preload_values, - :select_values, :group_values, :order_values, :joins_values, + :select_values, :group_values, :order_values, :joins_values, :unions_values, :where_values, :having_values, :bind_values, :limit_value, :offset_value, :lock_value, :readonly_value, :create_with_value, :from_value, :reordering_value, :reverse_order_value, @@ -123,6 +123,17 @@ def joins(*args) relation end + def union(*args) + return self if args.compact.blank? + + relation = clone + + relation.unions_values ||= [] + relation.unions_values += args + + relation + end + def bind(value) relation = clone relation.bind_values += [value] @@ -284,6 +295,8 @@ def build_arel arel.from(@from_value) if @from_value arel.lock(@lock_value) if @lock_value + build_union(arel, @unions_values) unless @unions_values.empty? + arel end @@ -375,6 +388,10 @@ def build_joins(manager, joins) manager end + def build_union(arel, unions) + arel.union(*unions.map {|union| union.build_arel}) + end + def build_select(arel, selects) unless selects.empty? @implicit_readonly = false