Я использую несущую волну в проекте Rails 4 с хранилищем файлов для разработки и тестирования и хранения тумана (для хранения на Amazon S3) для производства.Carrierwave: file hash и идентификатор модели в filename/store_dir
Я хотел бы сохранить мои файлы с путями, как это:
/model_class_name/part_of_hash/another_part_of_hash/hash-model_id.file_extension
(пример: /images/12/34/1234567-89.png
где 1234567 является SHA1 хэш содержимого файла и 89 является идентификатор соответствующей модели изображения в база данных).
То, что я пытался до сих пор это:
class MyUploader < CarrierWave::Uploader::Base
def store_dir
"#{model.class.name.underscore}/#{sha1_for(file)[0..1]}/#{sha1_for(file)[2..3]}"
end
def filename
"#{sha1_for(file)}-#{model.id}.#{file.extension}" if original_file
end
private
def sha1_for file
Digest::SHA1.hexdigest file.read
end
end
Это не работает, потому что:
model.id
не доступен, когдаfilename
называетсяfile
не всегда доступны, когдаstore_dir
является под названием
Так, приходя в мои вопросы:
- возможно использовать модели иды/атрибутов в
filename
? This link говорит, что это не должно быть сделано; есть ли способ обойти это? - Можно ли использовать содержимое/атрибуты файлов в пределах
store_dir
? Я не нашел никакой документации по этому поводу, но мой опыт до сих пор говорит «нет» (см. Выше). - Как бы вы реализовали имя файла/каталога, чтобы получить что-то как можно ближе к тому, что я изложил в начале?
Я принял ваш ответ, так как он отвечает на каждую точку моего вопроса, спасибо. Если вы заинтересованы в моем конечном решении, ознакомьтесь с моим собственным ответом, детализирующим его ... – severin