aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/CHANGELOG.md
diff options
context:
space:
mode:
authorJon Leighton <j@jonathanleighton.com>2013-01-27 20:31:01 +0000
committerJon Leighton <j@jonathanleighton.com>2013-01-27 20:34:52 +0000
commitc8d889905dab071f1d8a166b25fa69cdd31dc176 (patch)
tree99703805e1fba618424676ae66cf78a30ce0a35c /activerecord/CHANGELOG.md
parent78562309fc44a4bf28dcadd048e81545ccc716fb (diff)
downloadrails-c8d889905dab071f1d8a166b25fa69cdd31dc176.tar.gz
rails-c8d889905dab071f1d8a166b25fa69cdd31dc176.tar.bz2
rails-c8d889905dab071f1d8a166b25fa69cdd31dc176.zip
Prevent Relation#merge from collapsing wheres on the RHS
This caused a bug with the new associations implementation, because now association conditions are represented as Arel nodes internally right up to when the whole thing gets turned to SQL. In Rails 3.2, association conditions get turned to raw SQL early on, which prevents Relation#merge from interfering. The current implementation was buggy when a default_scope existed on the target model, since we would basically end up doing: default_scope.merge(association_scope) If default_scope contained a where(foo: 'a') and association_scope contained a where(foo: 'b').where(foo: 'c') then the merger would see that the same column is representated on both sides of the merge and collapse the wheres to all but the last: where(foo: 'c') Now, the RHS of the merge is left alone. Fixes #8990
Diffstat (limited to 'activerecord/CHANGELOG.md')
-rw-r--r--activerecord/CHANGELOG.md26
1 files changed, 26 insertions, 0 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index 9e22be1b94..c6a6e44724 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,5 +1,31 @@
## Rails 4.0.0 (unreleased) ##
+* Relation#merge now only overwrites where values on the LHS of the
+ merge. Consider:
+
+ left = Person.where(age: [13, 14, 15])
+ right = Person.where(age: [13, 14]).where(age: [14, 15])
+
+ `left` results in the following SQL:
+
+ WHERE age IN (13, 14, 15)
+
+ `right` results in the following SQL:
+
+ WHERE age IN (13, 14) AND age IN (14, 15)
+
+ Previously, `left.merge(right)` would result in all but the last
+ condition being removed:
+
+ WHERE age IN (14, 15)
+
+ Now it results in the LHS condition(s) for `age` being removed, but
+ the RHS remains as it is:
+
+ WHERE age IN (13, 14) AND age IN (14, 15)
+
+ *Jon Leighton*
+
* Fix handling of dirty time zone aware attributes
Previously, when `time_zone_aware_attributes` were enabled, after