用paperclip中的id_partition替代id
用paperclip中的id_partition代替id
很多网站都允许用户上传文件,如何管理这些上传的文件呢?以paperclip为例,其默认文件布局结构为:
@default_options ||= { :url => "/system/:attachment/:id/:style/:basename.:extension", :path => ":rails_root/public/system/:attachment/:id/:style/:basename.:extension", :styles => {}, :default_url => "/:attachment/:style/missing.png", :default_style => :original, :validations => {}, :storage => :filesystem }
每个id都会占据一个目录,问题是文件系统的子目录数量是有限制的,ext3是32000,ext4是64000,所以网站的数据量达到规模时,默认的文件布局并不合适。比较好的方式是采用id_partition,即把id表示成九位,并且分成3级目录,例如:
1 => 000/000/001
10000 => 000/010/000
100000000 => 100/000/000
这样就无须为文件系统的子目录数量限制担忧了。实现上同样以paperclip为例:
has_attached_file :picture, :styles => {:medium => "480x360>", :thumb => "120x90>", :original =>"480x360>"}, :path => ":rails_root/public/uploads/:class/:id_partition/:style/picture.:extension", :url => "/uploads/:class/:id_partition/:style/picture.:extension"
其中的:id_partition是paperclip内部支持的。