Use the storage_ prefix for migrated attachments

Just like we add the `storage_` prefix for new records so we can use
both Active Storage and Paperclip at the same time.

Now the migration actually works, at least for basic cases.
This commit is contained in:
Javi Martín
2021-07-27 00:38:14 +02:00
parent b4b42c7cc9
commit 9900a21fd5
2 changed files with 42 additions and 2 deletions

View File

@@ -46,7 +46,7 @@ namespace :active_storage do
instance.send("#{attachment}_file_size"), instance.send("#{attachment}_file_size"),
Digest::MD5.base64digest(File.read(instance.send(attachment).path)), Digest::MD5.base64digest(File.read(instance.send(attachment).path)),
instance.updated_at.iso8601, instance.updated_at.iso8601,
attachment, "storage_#{attachment}",
model.name, model.name,
instance.id, instance.id,
instance.updated_at.iso8601 instance.updated_at.iso8601
@@ -58,7 +58,7 @@ namespace :active_storage do
ActiveStorage::Attachment.find_each do |attachment| ActiveStorage::Attachment.find_each do |attachment|
dest = ActiveStorage::Blob.service.path_for(attachment.blob.key) dest = ActiveStorage::Blob.service.path_for(attachment.blob.key)
name = attachment.name name = attachment.name.delete_prefix("storage_")
source = attachment.record.send(name).path source = attachment.record.send(name).path
FileUtils.mkdir_p(File.dirname(dest)) FileUtils.mkdir_p(File.dirname(dest))

View File

@@ -0,0 +1,40 @@
require "rails_helper"
describe "active storage tasks" do
describe "migrate_from_paperclip" do
let(:run_rake_task) do
Rake::Task["active_storage:migrate_from_paperclip"].reenable
Rake.application.invoke_task("active_storage:migrate_from_paperclip")
end
let(:storage_root) { ActiveStorage::Blob.service.root }
before { FileUtils.rm_rf storage_root }
it "migrates records and attachments" do
document = create(:document,
attachment: nil,
paperclip_attachment: File.new("spec/fixtures/files/clippy.pdf"))
expect(ActiveStorage::Attachment.count).to eq 0
expect(ActiveStorage::Blob.count).to eq 0
expect(test_storage_file_paths.count).to eq 0
run_rake_task
document.reload
expect(ActiveStorage::Attachment.count).to eq 1
expect(ActiveStorage::Blob.count).to eq 1
expect(document.storage_attachment.filename).to eq "clippy.pdf"
expect(test_storage_file_paths.count).to eq 1
expect(storage_file_path(document)).to eq test_storage_file_paths.first
end
def test_storage_file_paths
Dir.glob("#{storage_root}/**/*").select { |file_or_folder| File.file?(file_or_folder) }
end
def storage_file_path(record)
ActiveStorage::Blob.service.path_for(record.storage_attachment.blob.key)
end
end
end