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