diff options
author | Jon Leighton <j@jonathanleighton.com> | 2013-04-05 05:57:27 -0700 |
---|---|---|
committer | Jon Leighton <j@jonathanleighton.com> | 2013-04-05 05:57:27 -0700 |
commit | 685cf144a9b7171160d6ac71da993349d1b0eda8 (patch) | |
tree | 6ebd80481a4f47de75181aaa657748c223910507 /activerecord | |
parent | bab0e2804d1c061bf639e2fb01ffc27b9e98384e (diff) | |
parent | 448381593edf0b87e3afd4945bd13650a7483b17 (diff) | |
download | rails-685cf144a9b7171160d6ac71da993349d1b0eda8.tar.gz rails-685cf144a9b7171160d6ac71da993349d1b0eda8.tar.bz2 rails-685cf144a9b7171160d6ac71da993349d1b0eda8.zip |
Merge pull request #9996 from mikz/master
Association with inverse_of does not set the parent in association building block
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/CHANGELOG.md | 17 | ||||
-rw-r--r-- | activerecord/lib/active_record/associations/association.rb | 1 | ||||
-rw-r--r-- | activerecord/test/cases/associations/inverse_associations_test.rb | 16 |
3 files changed, 34 insertions, 0 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 0dcc7a4819..db9aa858c2 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -418,6 +418,23 @@ # This will expand the order :name to "authors".name. Author.joins(:books).where('books.published = 1').order(:name) +* Fix associations with `:inverse_of` option when building association + with a block. Inside the block the parent object was different then + after the block. + + Example: + + parent.association.build do |child| + child.parent.equal?(parent) # false + end + + # vs + + child = parent.association.build + child.parent.equal?(parent) # true + + *Michal Cichra* + ## Rails 4.0.0.beta1 (February 25, 2013) ## diff --git a/activerecord/lib/active_record/associations/association.rb b/activerecord/lib/active_record/associations/association.rb index f3f4792eaa..729ef8c55a 100644 --- a/activerecord/lib/active_record/associations/association.rb +++ b/activerecord/lib/active_record/associations/association.rb @@ -236,6 +236,7 @@ module ActiveRecord skip_assign = [reflection.foreign_key, reflection.type].compact attributes = create_scope.except(*(record.changed - skip_assign)) record.assign_attributes(attributes) + set_inverse_instance(record) end end end diff --git a/activerecord/test/cases/associations/inverse_associations_test.rb b/activerecord/test/cases/associations/inverse_associations_test.rb index 85d0ad0aa1..ec128acf28 100644 --- a/activerecord/test/cases/associations/inverse_associations_test.rb +++ b/activerecord/test/cases/associations/inverse_associations_test.rb @@ -235,6 +235,22 @@ class InverseHasManyTests < ActiveRecord::TestCase assert_equal m.name, i.man.name, "Name of man should be the same after changes to newly-created-child-owned instance" end + def test_parent_instance_should_be_shared_within_create_block_of_new_child + man = Man.first + interest = man.interests.build do |i| + assert i.man.equal?(man), "Man of child should be the same instance as a parent" + end + assert interest.man.equal?(man), "Man of the child should still be the same instance as a parent" + end + + def test_parent_instance_should_be_shared_within_build_block_of_new_child + man = Man.first + interest = man.interests.build do |i| + assert i.man.equal?(man), "Man of child should be the same instance as a parent" + end + assert interest.man.equal?(man), "Man of the child should still be the same instance as a parent" + end + def test_parent_instance_should_be_shared_with_poked_in_child m = men(:gordon) i = Interest.create(:topic => 'Industrial Revolution Re-enactment') |