Carrierwave: hash de archivo e id de modelo en nombre de archivo / dir_compartido

Estoy usando carrierwave en un proyecto de Rails 4 con el almacenamiento de archivos para desarrollo y pruebas y el almacenamiento de niebla (para almacenamiento en Amazon S3) para producción.

Me gustaría guardar mis archivos con rutas como esta:

/model_class_name/part_of_hash/another_part_of_hash/hash-model_id.file_extension

(ejemplo:/images/12/34/1234567-89.png donde 1234567 es el hash SHA1 del contenido del archivo y 89 es el ID del modelo de imagen asociado en la base de datos).

Lo que intenté hasta ahora es esto:

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

Esto no funciona porque:

model.id no está disponible cuandofilename se llamafile no siempre está disponible cuandostore_dir se llama

Entonces, llegando aMis preguntas:

¿Es posible usar identificadores / atributos de modelo dentro defilename? Este enlace dice que no se debe hacer; ¿Hay una manera de evitarlo?¿Es posible utilizar el contenido del archivo / atributos dentro destore_dir? No encontré documentación sobre esto, pero mis experiencias hasta ahora dicen "no" (ver arriba).¿Cómo implementaría la denominación de archivos / directorios para obtener algo lo más cercano posible a lo que describí al principio?

Respuestas a la pregunta(3)

Su respuesta a la pregunta