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? Я не нашел документации по этому вопросу, но мой опыт пока говорит «нет» (см. Выше).Как бы вы внедрили именование файлов / каталогов, чтобы получить что-то максимально похожее на то, что я описал в начале?

Ответы на вопрос(3)

Ваш ответ на вопрос