Rails 4 プロジェクトで、開発とテスト用のファイル ストレージと本番用のフォグ ストレージ (Amazon S3 に保存するため) を使用して、carrierwave を使用しています。
次のようなパスでファイルを保存したいと思います。
/model_class_name/part_of_hash/another_part_of_hash/hash-model_id.file_extension
(例: /images/12/34/1234567-89.png
1234567 はファイル コンテンツの SHA1 ハッシュであり、89 はデータベース内の関連付けられたイメージ モデルの ID です)。
これまでに試したことは次のとおりです。
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
が呼び出されたときに常に利用できるとは限りません
だから、私の質問に来て:
- 内でモデル ID/属性を使用することは可能
filename
ですか? このリンクは、それを行うべきではないと言っています。それを回避する方法はありますか? - 内でファイルのコンテンツ/属性を使用することは可能
store_dir
ですか? これに関するドキュメントは見つかりませんでしたが、これまでの私の経験では「いいえ」と言われています(上記を参照)。 - 最初に概説したものにできるだけ近いものを得るために、ファイル/ディレクトリの命名をどのように実装しますか?