使用Rails ActiveStorage删除旧版本

时间:2019-03-02 23:01:42

标签: ruby-on-rails rails-activestorage

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

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

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

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

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

  • 硬编码所有以前的变体生成的哈希值以使其在所有先前的图像上重新运行都是不可能的。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我有一些时间来研究ActiveStorage。事实证明,变体以variants/前缀存储,这使查找变体变得更加容易。 :)很可惜,这在任何地方都没有记录。

如果我有一个Pic的{​​{1}},则可以轻松删除其所有变体:has_one_attached :image。不过,我将不得不根据要求在变体上调用pic.image.service.delete_prefixed("variants/#{pic.image.key}"),以确保重新创建变体。

我唯一还没有弄清楚的是如何找出不同的年龄。我想信息丢失了,所以我将不得不自己进行管理,以使我知道哪些变体最近未被访问,应该删除。