Я пытаюсь перемещать файлы по корзине S3, используя CarrierWave
для реорганизации структуры папок.
Я пришел к существующему приложению Rails, где все изображения для класса загружаются в папку с именем /uploads
. Это вызывает проблемы, когда два пользователя загружают разные изображения с одним и тем же именем файла, второе изображение перезаписывает первое. Чтобы решить эту проблему, я хочу реорганизовать папки, чтобы поместить каждое изображение в отдельный каталог в соответствии с экземпляром объекта ActiveRecord
. Мы используем CarrierWave
для управления загрузкой файлов.
Старый код загрузчика имел следующий метод:
def store_dir
"uploads"
end
Я изменил метод, чтобы отразить мою новую схему хранения файлов:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
Это отлично работает для новых изображений, но ломает URL для старых изображений. Существующие изображения сразу сообщают, что их URL-адрес находится в новой папке, когда я меняю модель, в то время как файлы изображений все еще хранятся в /uploads
.
> object.logo.store_dir
=> "uploads/object/logo/133"
Это неправильно. Этот объект должен сообщить свой логотип в /uploads
.
Мое решение состоит в том, чтобы написать сценарий для перемещения файлов изображений, но я не нашел в CarrierWave правильных методов для перемещения файлов. Мой сценарий будет выглядеть примерно так:
MyClass.all.each |image|
filename = file.name #This method exists in my uploader, returns the file name
#Move the file from "/uploads" to "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
Что я должен сделать в третьей строке моего скрипта, чтобы переместить файл в новое место?