aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorRafael Mendonça França <rafaelmfranca@gmail.com>2014-11-10 15:46:02 -0200
committerRafael Mendonça França <rafaelmfranca@gmail.com>2014-11-10 15:46:02 -0200
commit2574212423022a9b8d0ed70df500273b24c1f0d3 (patch)
treee7131ea1326802066c80b7f0a6f3821cb6f55f6c /activerecord
parent2a843b3538bbc88286b83562fe1bb517e01576f6 (diff)
parentcc405496ce85ee0073268baefdb2be5d4b062f91 (diff)
downloadrails-2574212423022a9b8d0ed70df500273b24c1f0d3.tar.gz
rails-2574212423022a9b8d0ed70df500273b24c1f0d3.tar.bz2
rails-2574212423022a9b8d0ed70df500273b24c1f0d3.zip
Merge pull request #11694 from Empact/association-bind-values-not-updated-on-save
Fix that a collection proxy could be cached before the save of the owner, resulting in an invalid proxy lacking the owner’s id Conflicts: activerecord/CHANGELOG.md
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG.md6
-rw-r--r--activerecord/lib/active_record/associations/collection_association.rb8
-rw-r--r--activerecord/test/cases/associations/has_many_associations_test.rb7
3 files changed, 20 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index c4b74c6477..2c66ddb983 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,3 +1,9 @@
+* Cache `CollectionAssociation#reader` proxies separately before and after
+ the owner has been saved so that the proxy is not cached without the
+ owner's id.
+
+ *Ben Woosley*
+
* `ActiveRecord::ReadOnlyRecord` now has a descriptive message.
*Franky W.*
diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb
index 4411e5ae62..93f611dd8d 100644
--- a/activerecord/lib/active_record/associations/collection_association.rb
+++ b/activerecord/lib/active_record/associations/collection_association.rb
@@ -33,7 +33,13 @@ module ActiveRecord
reload
end
- @proxy ||= CollectionProxy.create(klass, self)
+ if owner.new_record?
+ # Cache the proxy separately before the owner has an id
+ # or else a post-save proxy will still lack the id
+ @new_record_proxy ||= CollectionProxy.create(klass, self)
+ else
+ @proxy ||= CollectionProxy.create(klass, self)
+ end
end
# Implements the writer method, e.g. foo.items= for Foo.has_many :items
diff --git a/activerecord/test/cases/associations/has_many_associations_test.rb b/activerecord/test/cases/associations/has_many_associations_test.rb
index 1617e883ba..69f7bde4bc 100644
--- a/activerecord/test/cases/associations/has_many_associations_test.rb
+++ b/activerecord/test/cases/associations/has_many_associations_test.rb
@@ -413,6 +413,13 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
assert_equal "Summit", Firm.all.merge!(:order => "id").first.clients_using_primary_key.first.name
end
+ def test_update_all_on_association_accessed_before_save
+ firm = Firm.new(name: 'Firm')
+ firm.clients << Client.first
+ firm.save!
+ assert_equal firm.clients.count, firm.clients.update_all(description: 'Great!')
+ end
+
def test_belongs_to_sanity
c = Client.new
assert_nil c.firm, "belongs_to failed sanity check on new object"