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

它对您不起作用的原因是您始终使用预初始化选项。但是你可以尝试改变一些东西来改进它。例如,您可以使用 lambda 表达式来计算文件名...尝试类似下一个

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"} }

并改变这个

将文件名分配给临时图像路径。更新代码@class TempUploadedFile store_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 回答