diff options
author | Matthew Draper <matthew@trebex.net> | 2016-08-31 02:13:03 +0930 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-31 02:13:03 +0930 |
commit | e912915a006140350e411f1d0234fa2597491e37 (patch) | |
tree | aa52e8a940978ad6e4768a3d36fa11a80c8f1592 | |
parent | f4418c9a1a2f44d49521cee9881617d163ad729d (diff) | |
parent | a94fe2971b24d2a7827e205e7898e1b22771ed72 (diff) | |
download | rails-e912915a006140350e411f1d0234fa2597491e37.tar.gz rails-e912915a006140350e411f1d0234fa2597491e37.tar.bz2 rails-e912915a006140350e411f1d0234fa2597491e37.zip |
Merge pull request #23498 from jcoleman/remove-unnecessary-belongs-to-load
Don't unnecessarily load a belongs_to when saving.
-rw-r--r-- | activerecord/CHANGELOG.md | 5 | ||||
-rw-r--r-- | activerecord/lib/active_record/autosave_association.rb | 4 | ||||
-rw-r--r-- | activerecord/test/cases/associations/belongs_to_associations_test.rb | 6 |
3 files changed, 14 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 4aa1853bde..7838fe7167 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,8 @@ +* Remove unnecessarily association load when a `belongs_to` association has already been + loaded then the foreign key is changed directly and the record saved. + + *James Coleman* + * Remove standardized column types/arguments spaces in schema dump. *Tim Petricola* diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index 6e6620aad5..db84876b0a 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -457,7 +457,9 @@ module ActiveRecord # In addition, it will destroy the association if it was marked for destruction. def save_belongs_to_association(reflection) association = association_instance_get(reflection.name) - record = association && association.load_target + return unless association && association.loaded? && !association.stale_target? + + record = association.load_target if record && !record.destroyed? autosave = reflection.options[:autosave] diff --git a/activerecord/test/cases/associations/belongs_to_associations_test.rb b/activerecord/test/cases/associations/belongs_to_associations_test.rb index 3f42cb9b9d..2418346d1b 100644 --- a/activerecord/test/cases/associations/belongs_to_associations_test.rb +++ b/activerecord/test/cases/associations/belongs_to_associations_test.rb @@ -626,6 +626,12 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase assert_queries(0) { tagging.super_tag } end + def test_dont_find_target_when_saving_foreign_key_after_stale_association_loaded + client = Client.create!(name: "Test client", firm_with_basic_id: Firm.find(1)) + client.firm_id = Firm.create!(name: "Test firm").id + assert_queries(1) { client.save! } + end + def test_field_name_same_as_foreign_key computer = Computer.find(1) assert_not_nil computer.developer, ":foreign key == attribute didn't lock up" # ' |