From 61ea3c286de4fff493e531f8fe755728d1559408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dorian=20Mari=C3=A9?= Date: Mon, 17 Jan 2022 21:46:54 +0100 Subject: [PATCH] Fix error when saving an association with a relation named record ArgumentError: wrong number of arguments (given 3, expected 0) /Users/dorianmariefr/.rvm/rubies/ruby-3.0.2/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/associations/builder/belongs_to.rb:132:in `record_changed?' /Users/dorianmariefr/.rvm/rubies/ruby-3.0.2/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/autosave_association.rb:450:in `save_has_one_association' --- .../lib/active_record/autosave_association.rb | 4 ++-- .../test/cases/autosave_association_test.rb | 13 +++++++++++++ activerecord/test/models/attachment.rb | 7 +++++++ activerecord/test/models/translation.rb | 9 +++++++++ activerecord/test/schema/schema.rb | 11 +++++++++++ 5 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 activerecord/test/models/attachment.rb create mode 100644 activerecord/test/models/translation.rb diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index 9e9cc4c79d..88e845fd3b 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -446,7 +446,7 @@ module ActiveRecord elsif autosave != false key = reflection.options[:primary_key] ? public_send(reflection.options[:primary_key]) : id - if (autosave && record.changed_for_autosave?) || record_changed?(reflection, record, key) + if (autosave && record.changed_for_autosave?) || _record_changed?(reflection, record, key) unless reflection.through_reflection record[reflection.foreign_key] = key association.set_inverse_instance(record) @@ -461,7 +461,7 @@ module ActiveRecord end # If the record is new or it has changed, returns true. - def record_changed?(reflection, record, key) + def _record_changed?(reflection, record, key) record.new_record? || association_foreign_key_changed?(reflection, record, key) || record.will_save_change_to_attribute?(reflection.foreign_key) diff --git a/activerecord/test/cases/autosave_association_test.rb b/activerecord/test/cases/autosave_association_test.rb index ef5c71dd46..4ebf90a9ef 100644 --- a/activerecord/test/cases/autosave_association_test.rb +++ b/activerecord/test/cases/autosave_association_test.rb @@ -34,6 +34,8 @@ require "models/organization" require "models/guitar" require "models/tuning_peg" require "models/reply" +require "models/attachment" +require "models/translation" class TestAutosaveAssociationsInGeneral < ActiveRecord::TestCase def test_autosave_works_even_when_other_callbacks_update_the_parent_model @@ -2008,3 +2010,14 @@ class TestAutosaveAssociationOnAHasManyAssociationDefinedInSubclassWithAcceptsNe assert_equal "Updated", valid_project.name end end + +class TestAutosaveAssociationOnABelongsToAssociationDefinedAsRecord < ActiveRecord::TestCase + def test_should_not_raise_error + translation = Translation.create(locale: "fr", key: "bread", value: "Baguette 🥖") + author = Author.create(name: "Dorian Marié") + translation.build_attachment(record: author) + assert_nothing_raised do + translation.save! + end + end +end diff --git a/activerecord/test/models/attachment.rb b/activerecord/test/models/attachment.rb new file mode 100644 index 0000000000..2d4bc57dc5 --- /dev/null +++ b/activerecord/test/models/attachment.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class Attachment < ActiveRecord::Base + belongs_to :record, polymorphic: true + + has_one :translation +end diff --git a/activerecord/test/models/translation.rb b/activerecord/test/models/translation.rb new file mode 100644 index 0000000000..f7485ba356 --- /dev/null +++ b/activerecord/test/models/translation.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class Translation < ActiveRecord::Base + belongs_to :attachment, optional: true + + validates :locale, presence: true + validates :key, presence: true + validates :value, presence: true +end diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb index 58b5a95724..89c3f85304 100644 --- a/activerecord/test/schema/schema.rb +++ b/activerecord/test/schema/schema.rb @@ -58,6 +58,10 @@ ActiveRecord::Schema.define do t.references :tag end + create_table :attachments, force: true do |t| + t.references :record, polymorphic: true, null: false + end + create_table :audit_logs, force: true do |t| t.column :message, :string, null: false t.column :developer_id, :integer, null: false @@ -1107,6 +1111,13 @@ ActiveRecord::Schema.define do t.datetime :updated_at end + create_table :translations, force: true do |t| + t.string :locale, null: false + t.string :key, null: false + t.string :value, null: false + t.references :attachment + end + create_table :tuning_pegs, force: true do |t| t.integer :guitar_id t.float :pitch