diff options
author | Pratik Naik <pratiknaik@gmail.com> | 2010-01-02 21:16:16 +0530 |
---|---|---|
committer | Pratik Naik <pratiknaik@gmail.com> | 2010-01-02 21:16:16 +0530 |
commit | f1acf1cc74bb9e847a4d27e97630d1b685764a93 (patch) | |
tree | 3196adac28dbd3902d01b70c18dd75cdcaedac7d /activerecord | |
parent | 3e6e3e90ef432f9fa70ee07e4ac4924e9005dc71 (diff) | |
download | rails-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')
-rw-r--r-- | activerecord/lib/active_record/relation.rb | 38 |
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 |