Rails 3 - 在file_column插件中禁用文件名缓存

时间:2012-04-25 12:14:55

标签: ruby-on-rails uuid

这是获取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不能被缓存?

1 个答案:

答案 0 :(得分:0)

由于您始终使用预初始化选项,因此它不适合您。 但你可以尝试改变一些东西来改善它。例如,您可以将lambda表达式用于calcaulationg文件名...尝试下一步

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)