diff --git a/activestorage/lib/active_storage/attached/one.rb b/activestorage/lib/active_storage/attached/one.rb index 0244232b2ca498698ca52d569398e66c71acb0cf..e3600dc24122f218f83d12ae194c278ba7f7c849 100644 --- a/activestorage/lib/active_storage/attached/one.rb +++ b/activestorage/lib/active_storage/attached/one.rb @@ -64,12 +64,16 @@ def purge_later private def replace(attachable) - blob.tap do + unless attachable == blob + previous_blob = blob + transaction do detach write_attachment build_attachment_from(attachable) end - end.purge_later + + previous_blob.purge_later + end end def build_attachment_from(attachable) diff --git a/activestorage/test/models/attachments_test.rb b/activestorage/test/models/attachments_test.rb index 9ba2759893cef4c9cf7899499f72a1cf35958ed4..4c6b3e60005b05ed1cee95b062099763bdc792ea 100644 --- a/activestorage/test/models/attachments_test.rb +++ b/activestorage/test/models/attachments_test.rb @@ -56,6 +56,18 @@ class ActiveStorage::AttachmentsTest < ActiveSupport::TestCase assert ActiveStorage::Blob.service.exist?(@user.avatar.key) end + test "replace attached blob with itself" do + @user.avatar.attach create_blob(filename: "funky.jpg") + + assert_no_changes -> { @user.reload.avatar.blob } do + assert_no_changes -> { @user.reload.avatar.attachment } do + assert_no_enqueued_jobs do + @user.avatar.attach @user.avatar.blob + end + end + end + end + test "attach blob to new record" do user = User.new(name: "Jason")