Отличный ответ Джонни Грасса и отличный вопрос Крис.У меня было несколько сотен файлов TIF на моем локальном компьютере, Heroku, paperclip и s3.Некоторые из tiff-файлов были размером> 100 МБ, поэтому заставление герою обратить внимание на эту долгую отложенную работу и некоторую дополнительную работу.Поскольку это был в основном однократный пакетный процесс (по 5 различных форм изображений, созданных на каждой по 5 загрузок), идея граблей идеально подходила.Здесь, в случае, если это помогает, это задача rake, которую я создал, предполагая, как Джонни написал, что ваша база данных разработки имеет текущие данные (используйте pg backup, чтобы получить новый набор идентификаторов) и подключена к S3.
У меня естьМодель называется «Предмет» с вложением «Изображение».Я хотел проверить, было ли уже у существующих Предметов изображение, и если нет, загрузить новый.Эффект заключается в зеркалировании каталога исходных файлов.Хорошим дополнением может быть проверка дат и просмотр обновленного локального tif.
# lib/image_management.rake
namespace :images do
desc 'upload images through paperclip with postprocessing'
task :create => :environment do
directory = "/Volumes/data/historicus/_projects/deeplandscapes/library/tifs/*.tif"
images = Dir[directory]
puts "\n\nProcessing #{ images.length } images in #{directory}..."
items_with_errors = []
items_updated = []
items_skipped = []
images.each do |image|
# find the needed record
image_basename = File.basename(image)
id = image_basename.gsub("it_", "").gsub(".tif", "").to_i
if id > 0
item = Item.find(id) rescue nil
# check if it has an image already
if item
unless item.image.exists?
# create the image
success = item.update_attributes(:image => File.open(image))
if success
items_updated << item
print ' u '
else
items_with_errors << item
print ' e '
end
else
items_skipped << item
print ' s '
end
else
print "[#{id}] "
end
else
print " [no id for #{image_basename}] "
end
end
unless items_with_errors.empty?
puts "\n\nThe following items had errors: "
items_with_errors.each do |error_image|
puts "#{error_image.id}: #{error_image.errors.full_messages}"
end
end
puts "\n\nUpdated #{items_updated.length} items."
puts "Skipped #{items_skipped.length} items."
puts "Update complete.\n"
end
end