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 llamaEntonces, 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?