不要将文件嵌套在 Rails 活动存储中

Nei*_*eil 8 ruby ruby-on-rails rails-activestorage

默认情况下,Rails Active Storage 似乎通过关联的active_storage_blob key.

默认行为的规则如下。目录内<Rails.root>/storage/

  • 取 的前两个字符key并创建一个目录
    • 在该目录中,取接下来的两个字符key并创建另一个目录
      • 将文件存储在那里,文件名是整个 key

例如:其中key关联的特定文件active_storage_blob是:2HadGpe3G4r5ygdgdfh5534346,它看起来如下所示:

Rails 活动存储嵌套默认行为

我不想要这种嵌套行为。我想将文件平面存储在存储目录中。所以我只是希望它看起来像这样:

所需的主动存储行为

我怎样才能做到这一点?谷歌搜索和通读Active Storage Rails 指南没有找到解决方案。

也只是出于好奇:为什么这是默认行为?

Cas*_*per 4

在 ActiveStorage DiskService 的代码中深入研究,我找到了生成文件夹结构的代码。所有内容都方便地包含在一个函数中:

def folder_for(key)
  [ key[0..1], key[2..3] ].join("/")
end
Run Code Online (Sandbox Code Playgroud)

这样可以通过简单的补丁轻松消除两个字母的子文件夹结构:

module ActiveStorage
  class Service::DiskService < Service
    private
      def folder_for(key)
        ""
      end
  end
end
Run Code Online (Sandbox Code Playgroud)

最好对此补丁进行一些测试,但据我所知它应该可以正常工作。

仅通过查看 DiskService 代码无法确定第二个问题的答案。没有任何关于此文件夹结构的线索,因此原因可能在其他地方。这样做可能完全是出于装饰目的,以避免大型服务器上出现巨大的单个文件夹斑点。也许了解更多的人可以发表评论。