用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内部支持的。

你可能感兴趣的:(数据结构,Rails)