aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorlaurocaetano <laurocaetano1@gmail.com>2013-10-24 00:06:49 -0200
committerlaurocaetano <laurocaetano1@gmail.com>2013-10-24 22:30:30 -0200
commit8022fc4913d5fa285889795617a1f37c5aa705a9 (patch)
tree00f9c83d367ea0f041417527ff2229620ddf4967 /activerecord
parentcc8d14827d117ed7da7a17c4a057a8e5f71625ca (diff)
downloadrails-8022fc4913d5fa285889795617a1f37c5aa705a9.tar.gz
rails-8022fc4913d5fa285889795617a1f37c5aa705a9.tar.bz2
rails-8022fc4913d5fa285889795617a1f37c5aa705a9.zip
Save association when primary key is manually set
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG.md6
-rw-r--r--activerecord/lib/active_record/autosave_association.rb8
-rw-r--r--activerecord/test/cases/associations/has_one_associations_test.rb11
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