0

これは、UUIDを取得するための私のコードです。

  def manage_id
    self.id = UUIDTools::UUID.random_create().to_s.upcase if self.id.blank?
  end

これは、私のオブジェクトの主キーに対して完全に機能します。

私の問題は、アップロードされたファイルにUUIDで名前を付けたいということです...そして、異なるアップロードに対して同じUUIDを取得します。たとえば、UUIDがあり、2分後に別のオブジェクトで同じUUIDがあります。

これは私の画像に名前を付けるためのクラスコードです:

:filename => "#{UUIDTools::UUID.random_create().to_s.upcase}.jpg" }

UUIDを生成するときに何が問題になる可能性があるのか​​わかりません...

私は開発に問題はありません!!!

編集1:問題はUUID自体にあるのではなく、タイムスタンプでも同じです...(そして本番環境でのみ)

編集2:私は問題を見つけました。設定:

config.cache_classes = true

プロダクションモードでの問題です。それは確かにUUIDをメモリのどこかに保持しています。

(パフォーマンスのために)本番モードではfalseに切り替えることができないと思うので、このプラグイン名機能のキャッシュを非アクティブ化する最良の方法は何ですか?

編集3:モデルの完全なコードを追加します

class Product < ActiveRecord::Base

 file_column :image, {:magick => { :versions => { "tiny" => "70x70", "small" => "160x240", "high" => "640x960" }}, :store_dir => "public/upload/wine/image", :web_root => "upload/", :filename => "#{UUIDTools::UUID.timestamp_create().to_s.upcase}.jpg" }

end

したがって、前述したように、生成されたUUIDは本番環境にキャッシュされます。このモデルまたはプラグインfile_columnを強制的にキャッシュしないようにする方法がわかりませんか?

4

1 に答える 1

0

常に事前に初期化されたオプションを使用しているため、機能しない理由。しかし、あなたはそれを改善するために何かを変えることを試みることができます。たとえば、calcaulationgfilenameにラムダ式を使用できます...次のようなものを試してください

file_column :image, {:magick => 
                            { :versions => 
                                { "tiny" => "70x70", "small" => "160x240", "high" => "640x960" }
                             },
                             :store_dir => "public/upload/wine/image", 
                             :web_root => "upload/", 
                             :filename => lambda { "#{UUIDTools::UUID.timestamp_create().to_s.upcase}.jpg"} }

これを変更します

ファイル名を一時イメージパスに割り当てます。更新コード@classTempUploadedFilestore_uploadメソッドの行番号219

@filename = options[:filename] || FileColumn::sanitize_filename(file.original_filename)

options_file_name = options[:filename].respond_to?(:call) ? options[:filename].call : options[:filename]


   @filename = options_file_name || FileColumn::sanitize_filename(file.original_filename)
于 2012-04-26T07:49:42.360 に答える