Carrierwave: хэш файла и идентификатор модели в имени файла / store_dir
Я использую carrierwave в проекте Rails 4 с хранилищем файлов для разработки и тестирования и хранилищем тумана (для хранения на Amazon S3) для производства.
Я хотел бы сохранить мои файлы с такими путями:
/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
? Эта ссылка говорит, что это не должно быть сделано; Есть ли способ обойти это?Можно ли использовать содержимое файла / атрибуты вstore_dir
? Я не нашел документации по этому вопросу, но мой опыт пока говорит «нет» (см. Выше).Как бы вы внедрили именование файлов / каталогов, чтобы получить что-то максимально похожее на то, что я описал в начале?