У меня есть несколько решений, которые могут работать для вас:
Перебирать ваши блоты ActiveStorage:
ActiveStorage::Blob.all.each do |blob|
# work with blob
end
затем ...
Rails <= 6.0 </p>
Вам понадобится ключ BLOB-объекта, контрольная сумма и локальный файл на диске.
local_file = ActiveStorage::Blob.service.primary.path_for(blob.key)
# I'm picking the first mirror but you can add some code to select a specific mirror
mirror = blob.service.mirrors.first
mirror.upload(blob.key, File.open(local_file), checksum: blob.checksum)
Rails 6.1.alpha +
Просто вызовите это для каждого большого двоичного объекта ...
blob.mirror_later
Вы также можете не загружать файл, если он уже существует на зеркале.Вы можете сделать это, выполнив следующее:
mirror = blob.service.mirrors.first
# If the file doesn't exist on the mirror, upload it
unless mirror.exist? blob.key
# Upload file to mirror
end
Собрав все вместе, задача граблей может выглядеть следующим образом:
# lib/tasks/active_storage.rake
namespace :active_storage do
desc 'Ensures all files are mirrored'
task mirror_all: [:environment] do
# Iterate through each blob
ActiveStorage::Blob.all.each do |blob|
# We assume the primary storage is local
local_file = ActiveStorage::Blob.service.primary.path_for(blob.key)
# Iterate through each mirror
blob.service.mirrors.each do |mirror|
# If the file doesn't exist on the mirror, upload it
mirror.upload(blob.key, File.open(local_file), checksum: blob.checksum) unless mirror.exist? blob.key
end
end
end
end