aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation.rb
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2009-12-28 01:08:34 +0530
committerPratik Naik <pratiknaik@gmail.com>2009-12-28 01:08:34 +0530
commita8b10a2a8d6f8d861453803264b9ef1b0cadbc6b (patch)
treeacc2d2ad06e34ccf11fc886ef4774210ec85d7aa /activerecord/lib/active_record/relation.rb
parent08312e9958b84de9aef07ba157eed04750567da4 (diff)
downloadrails-a8b10a2a8d6f8d861453803264b9ef1b0cadbc6b.tar.gz
rails-a8b10a2a8d6f8d861453803264b9ef1b0cadbc6b.tar.bz2
rails-a8b10a2a8d6f8d861453803264b9ef1b0cadbc6b.zip
Add relation#merge to merge two relations
Diffstat (limited to 'activerecord/lib/active_record/relation.rb')
-rw-r--r--activerecord/lib/active_record/relation.rb22
1 files changed, 17 insertions, 5 deletions
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb
index d1f4dc2101..967e429fc3 100644
--- a/activerecord/lib/active_record/relation.rb
+++ b/activerecord/lib/active_record/relation.rb
@@ -12,6 +12,18 @@ module ActiveRecord
@loaded = false
end
+ def merge(r)
+ joins(r.relation.joins(r.relation)).
+ group(r.send(:group_clauses).join(', ')).
+ order(r.send(:order_clauses).join(', ')).
+ where(r.send(:where_clause)).
+ limit(r.taken).
+ offset(r.skipped).
+ select(r.send(:select_clauses).join(', '))
+ end
+
+ alias :& :merge
+
def preload(*associations)
create_new_relation(@relation, @readonly, @associations_to_preload + Array.wrap(associations))
end
@@ -25,7 +37,7 @@ module ActiveRecord
end
def select(selects)
- create_new_relation(@relation.project(selects))
+ selects.present? ? create_new_relation(@relation.project(selects)) : create_new_relation
end
# TODO : This is temporary. We need .from in Arel.
@@ -37,11 +49,11 @@ module ActiveRecord
end
def group(groups)
- create_new_relation(@relation.group(groups))
+ groups.present? ? create_new_relation(@relation.group(groups)) : create_new_relation
end
def order(orders)
- create_new_relation(@relation.order(orders))
+ orders.present? ? create_new_relation(@relation.order(orders)) : create_new_relation
end
def reverse_order
@@ -57,11 +69,11 @@ module ActiveRecord
end
def limit(limits)
- create_new_relation(@relation.take(limits))
+ limits.present? ? create_new_relation(@relation.take(limits)) : create_new_relation
end
def offset(offsets)
- create_new_relation(@relation.skip(offsets))
+ offsets.present? ? create_new_relation(@relation.skip(offsets)) : create_new_relation
end
def on(join)