aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation.rb
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2010-01-02 21:16:16 +0530
committerPratik Naik <pratiknaik@gmail.com>2010-01-02 21:16:16 +0530
commitf1acf1cc74bb9e847a4d27e97630d1b685764a93 (patch)
tree3196adac28dbd3902d01b70c18dd75cdcaedac7d /activerecord/lib/active_record/relation.rb
parent3e6e3e90ef432f9fa70ee07e4ac4924e9005dc71 (diff)
downloadrails-f1acf1cc74bb9e847a4d27e97630d1b685764a93.tar.gz
rails-f1acf1cc74bb9e847a4d27e97630d1b685764a93.tar.bz2
rails-f1acf1cc74bb9e847a4d27e97630d1b685764a93.zip
Give higher preference to second relation's equality predicates when merging
Diffstat (limited to 'activerecord/lib/active_record/relation.rb')
-rw-r--r--activerecord/lib/active_record/relation.rb38
1 files changed, 27 insertions, 11 deletions
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb
index 8756695d46..44e2061efa 100644
--- a/activerecord/lib/active_record/relation.rb
+++ b/activerecord/lib/active_record/relation.rb
@@ -18,16 +18,32 @@ module ActiveRecord
def merge(r)
raise ArgumentError, "Cannot merge a #{r.klass.name} relation with #{@klass.name} relation" if r.klass != @klass
- 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(', ')).
- eager_load(r.eager_load_associations).
- preload(r.preload_associations).
- from(r.send(:sources).present? ? r.send(:from_clauses) : nil)
+ merged_relation = spawn(table)
+
+ [self, r].each do |r|
+ merged_relation = merged_relation.
+ joins(r.relation.joins(r.relation)).
+ group(r.send(:group_clauses).join(', ')).
+ order(r.send(:order_clauses).join(', ')).
+ limit(r.taken).
+ offset(r.skipped).
+ select(r.send(:select_clauses).join(', ')).
+ eager_load(r.eager_load_associations).
+ preload(r.preload_associations).
+ from(r.send(:sources).present? ? r.send(:from_clauses) : nil)
+ end
+
+ merged_wheres = @relation.wheres
+
+ r.wheres.each do |w|
+ if w.is_a?(Arel::Predicates::Equality)
+ merged_wheres = merged_wheres.reject {|p| p.is_a?(Arel::Predicates::Equality) && p.operand1.name == w.operand1.name }
+ end
+
+ merged_wheres << w
+ end
+
+ merged_relation.where(*merged_wheres)
end
alias :& :merge
@@ -129,7 +145,7 @@ module ActiveRecord
end
def spawn(relation = @relation)
- relation = self.class.new(@klass, relation)
+ relation = Relation.new(@klass, relation)
relation.readonly = @readonly
relation.preload_associations = @preload_associations
relation.eager_load_associations = @eager_load_associations