diff options
author | laurocaetano <laurocaetano1@gmail.com> | 2013-10-24 00:06:49 -0200 |
---|---|---|
committer | laurocaetano <laurocaetano1@gmail.com> | 2013-10-24 22:30:30 -0200 |
commit | 8022fc4913d5fa285889795617a1f37c5aa705a9 (patch) | |
tree | 00f9c83d367ea0f041417527ff2229620ddf4967 | |
parent | cc8d14827d117ed7da7a17c4a057a8e5f71625ca (diff) | |
download | rails-8022fc4913d5fa285889795617a1f37c5aa705a9.tar.gz rails-8022fc4913d5fa285889795617a1f37c5aa705a9.tar.bz2 rails-8022fc4913d5fa285889795617a1f37c5aa705a9.zip |
Save association when primary key is manually set
-rw-r--r-- | activerecord/CHANGELOG.md | 6 | ||||
-rw-r--r-- | activerecord/lib/active_record/autosave_association.rb | 8 | ||||
-rw-r--r-- | activerecord/test/cases/associations/has_one_associations_test.rb | 11 |
3 files changed, 24 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 22a37810bc..a0ec552eb6 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,9 @@ +* Save `has_one` association when primary key is manually set. + + Fixes #12302 + + *Lauro Caetano* + * Make `Relation#empty?` use `exists?` instead of `count`. *Szymon Nowak* diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index 561b2dd6d1..e9622ca0c1 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -384,7 +384,8 @@ module ActiveRecord record.destroy else key = reflection.options[:primary_key] ? send(reflection.options[:primary_key]) : id - if autosave != false && (new_record? || record.new_record? || record[reflection.foreign_key] != key || autosave) + if autosave != false && (autosave || new_record? || record_changed?(reflection, record, key)) + unless reflection.through_reflection record[reflection.foreign_key] = key end @@ -397,6 +398,11 @@ module ActiveRecord end end + # If the record is new or it has changed, returns true. + def record_changed?(reflection, record, key) + record.new_record? || record[reflection.foreign_key] != key || record.attribute_changed?(reflection.foreign_key) + end + # Saves the associated record if it's new or <tt>:autosave</tt> is enabled. # # In addition, it will destroy the association if it was marked for destruction. diff --git a/activerecord/test/cases/associations/has_one_associations_test.rb b/activerecord/test/cases/associations/has_one_associations_test.rb index 9cd4db8dc9..cdd386187b 100644 --- a/activerecord/test/cases/associations/has_one_associations_test.rb +++ b/activerecord/test/cases/associations/has_one_associations_test.rb @@ -524,4 +524,15 @@ class HasOneAssociationsTest < ActiveRecord::TestCase assert_equal 'new name', pirate.ship.reload.name end + def test_has_one_autosave_with_primary_key_manually_set + post = Post.create(id: 1234, title: "Some title", body: 'Some content') + author = Author.new(id: 33, name: 'Hank Moody') + + author.post = post + author.save + author.reload + + assert_not_nil author.post + assert_equal author.post, post + end end |