diff --git a/lib/tasks/active_storage.rake b/lib/tasks/active_storage.rake index a803840f9..bfc2fd2e0 100644 --- a/lib/tasks/active_storage.rake +++ b/lib/tasks/active_storage.rake @@ -40,6 +40,8 @@ namespace :active_storage do model.find_each.each do |instance| attachments.each do |attachment| + next if instance.send(:"storage_#{attachment}").attached? + source = instance.send(attachment).path next if source.blank? @@ -66,6 +68,9 @@ namespace :active_storage do ActiveStorage::Attachment.find_each do |attachment| dest = ActiveStorage::Blob.service.path_for(attachment.blob.key) + + next if File.exist?(dest) + name = attachment.name.delete_prefix("storage_") source = attachment.record.send(name).path diff --git a/spec/lib/tasks/active_storage_spec.rb b/spec/lib/tasks/active_storage_spec.rb index 06ef03a41..359a00ecb 100644 --- a/spec/lib/tasks/active_storage_spec.rb +++ b/spec/lib/tasks/active_storage_spec.rb @@ -44,6 +44,26 @@ describe "active storage tasks" do expect(test_storage_file_paths.count).to eq 0 end + it "does not migrate already migrated records" do + document = create(:document, attachment: File.new("spec/fixtures/files/clippy.pdf")) + + migrated_file = test_storage_file_paths.first + attachment_id = document.storage_attachment.attachment.id + blob_id = document.storage_attachment.blob.id + + run_rake_task + document.reload + + expect(ActiveStorage::Attachment.count).to eq 1 + expect(ActiveStorage::Blob.count).to eq 1 + expect(document.storage_attachment.attachment.id).to eq attachment_id + expect(document.storage_attachment.blob.id).to eq blob_id + + expect(test_storage_file_paths.count).to eq 1 + expect(storage_file_path(document)).to eq migrated_file + expect(test_storage_file_paths.first).to eq migrated_file + end + def test_storage_file_paths Dir.glob("#{storage_root}/**/*").select { |file_or_folder| File.file?(file_or_folder) } end