From 88c97f87e386a5690b1233f268fdc7acccf33cfa Mon Sep 17 00:00:00 2001 From: William Carey Date: Fri, 24 Apr 2020 12:16:16 -0500 Subject: [PATCH] Fix autosave association bug with ActiveStorage::Attachments Closes #37701. --- activestorage/lib/active_storage/attached/model.rb | 4 ++++ activestorage/test/database/create_groups_migration.rb | 8 ++++++++ activestorage/test/database/create_users_migration.rb | 1 + activestorage/test/database/setup.rb | 2 ++ activestorage/test/models/attached/one_test.rb | 8 ++++++++ activestorage/test/test_helper.rb | 1 + 6 files changed, 24 insertions(+) create mode 100644 activestorage/test/database/create_groups_migration.rb diff --git a/activestorage/lib/active_storage/attached/model.rb b/activestorage/lib/active_storage/attached/model.rb index da896f3f168e3..479f7f072ed86 100644 --- a/activestorage/lib/active_storage/attached/model.rb +++ b/activestorage/lib/active_storage/attached/model.rb @@ -140,6 +140,10 @@ def attachment_changes #:nodoc: @attachment_changes ||= {} end + def changed_for_autosave? #:nodoc: + super || attachment_changes.any? + end + def reload(*) #:nodoc: super.tap { @attachment_changes = nil } end diff --git a/activestorage/test/database/create_groups_migration.rb b/activestorage/test/database/create_groups_migration.rb new file mode 100644 index 0000000000000..245266933f31c --- /dev/null +++ b/activestorage/test/database/create_groups_migration.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class ActiveStorageCreateGroups < ActiveRecord::Migration[6.0] + def change + create_table :groups do |t| + end + end +end diff --git a/activestorage/test/database/create_users_migration.rb b/activestorage/test/database/create_users_migration.rb index fdba87cacfa4c..57a5fbe3101a3 100644 --- a/activestorage/test/database/create_users_migration.rb +++ b/activestorage/test/database/create_users_migration.rb @@ -4,6 +4,7 @@ class ActiveStorageCreateUsers < ActiveRecord::Migration[5.2] def change create_table :users do |t| t.string :name + t.integer :group_id end end end diff --git a/activestorage/test/database/setup.rb b/activestorage/test/database/setup.rb index daeeb5695b250..53159ed0cc7a6 100644 --- a/activestorage/test/database/setup.rb +++ b/activestorage/test/database/setup.rb @@ -1,7 +1,9 @@ # frozen_string_literal: true require_relative "create_users_migration" +require_relative "create_groups_migration" ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") ActiveRecord::Base.connection.migration_context.migrate ActiveStorageCreateUsers.migrate(:up) +ActiveStorageCreateGroups.migrate(:up) diff --git a/activestorage/test/models/attached/one_test.rb b/activestorage/test/models/attached/one_test.rb index ac08d324bb0d4..a7c5e9b67cba1 100644 --- a/activestorage/test/models/attached/one_test.rb +++ b/activestorage/test/models/attached/one_test.rb @@ -286,6 +286,14 @@ class ActiveStorage::OneAttachedTest < ActiveSupport::TestCase assert_equal 2736, @user.avatar.metadata[:height] end + test "updating an attachment as part of an autosave association" do + group = Group.create!(users: [@user]) + @user.avatar = fixture_file_upload("racecar.jpg") + group.save! + @user.reload + assert @user.avatar.attached? + end + test "attaching an existing blob to a new record" do User.new(name: "Jason").tap do |user| user.avatar.attach create_blob(filename: "funky.jpg") diff --git a/activestorage/test/test_helper.rb b/activestorage/test/test_helper.rb index e9a0561c02193..150b8c10fc60b 100644 --- a/activestorage/test/test_helper.rb +++ b/activestorage/test/test_helper.rb @@ -100,6 +100,7 @@ class User < ActiveRecord::Base class Group < ActiveRecord::Base has_one_attached :avatar + has_many :users, autosave: true end require_relative "../../tools/test_common"