使用Rails ActiveStorage删除旧版本

Gab*_*yel 5 ruby-on-rails rails-activestorage

我有一个类似照片存储的应用程序(Rails 5.2),它使用ActiveStorage来存储实际的照片。一切都很好,我为用户生成了带水印的缩略图,以作为变体显示(原始信息不是公开的,实际上每个图像需要一些变体)。

如果必须更改生成此类变体的方式怎么办?S3存储并不便宜(图像数量在成千上万个),并且ActiveStorage根本不跟踪变体-它们仅由我精确生成它们的哈希值来识别。如果我更改变体哈希(例如更改缩略图大小),则会创建新的哈希,但是很多旧的blob将保留在未引用的存储中。

这里也描述相同的问题,但没有解决方案。

您如何处理旧版本?我希望变量存储能够像缓存一样工作,尤其是我的用户通常不会查看旧图像。如果某个变体比给定年龄大,我只想删除它-但我无能为力。还是我

  • 我可以看一下存储中的实际blob-但没有区别,也没有元数据。在S3中,所有这些文件看起来都一样,关键只是其制作方式的哈希值,并且没有相关的元数据。

  • 硬编码所有先前的变体生成的哈希值以在所有先前的映像上重新运行绝不是要走的路。

  • 我也许可以在ActiveStorage中打补丁(Variation也许?)来添加元数据(指示哪些blob是变量,哪些是原始对象)?然后,我可以进行后端作业以删除旧版本。这行得通吗?如何使它与ActiveStorage的将来版本兼容?

  • 我应该自己跟踪变体吗?那么为什么在ActiveStorage中它不是一个选项?显然,这也需要更改ActiveStorage类。

  • 是否可以将变体存储在其他存储中(例如另一个S3存储桶)?这也将解决问题,因为我随后将知道哪些斑点是变体,并且可以轻松清除旧斑点。

你们如何处理旧的不必要的变体?

Gab*_*yel 6

我有时间深入研究 ActiveStorage。事实证明,变体与variants/前缀一起存储,这使得查找它们变得更加容易。:) 很遗憾,这在任何地方都没有记录。

如果我有Picthat has_one_attached :image,我可以轻松删除它的所有变体:pic.image.service.delete_prefixed("variants/#{pic.image.key}"). 然后我将不得不.processed根据要求调用变体,以确保它们被重新创建。

我唯一还没有弄清楚的是如何找出变异年龄。我想这些信息丢失了,所以我必须自己管理它,以便我知道哪些变体最近没有被访问过,应该删除。