有关使用 ActiveStorage with Rails 5+ 存储的 blob 的元数据



我们已经在少数生产应用程序上使用rails 5.2RC1几个星期来测试ActiveStorage。 我们已经能够让所有内容都与我们的 Heroku 实例(包括 PDF 预览)配合使用,但现在遇到了一些关于最佳实践的问题。

假设我们有以下模型:

class Contract < ApplicationRecord
has_many_attached :documents
end

这非常有效。

但是,现在我们想添加一些关于每个单独文档的其他数据。 也许是合同的文档类型或其他类型的元数据。

我们的第一个想法是尝试将其填充到 blob 的元数据属性中,但这感觉不对。

我们的另一个想法是将设计更改为这样的内容:

class Contract < ApplicationRecord
has_many :documents
end
class Document < ApplicationRecord
belongs_to :contract
has_many_attached  :files
end

然后使用文档模型保留有关每个附件的信息。 假设在这个例子中,合同有一个原始文档,但将来可能会附加附录,这些附录具有我们想要跟踪的独特属性。

思潮?

在提出这个问题时,可能是元数据被覆盖了,如本 Github 问题中所述。虽然元数据仍然不可查询(来吧伙计们,将近 5 年过去了),但您绝对可以添加自定义属性。

奇怪的是,attach()函数参数metadata文档中说它应该是一个字符串,但这不起作用并被分析器覆盖。如果只是将其更改为对象文本,则正常工作,并且自定义元数据将与分析器元数据合并。

所以这有效:

payment.archives.attach(
io: File.open("./archive.zip"),
filename: "archive.zip",
content_type: "application/gzip",
metadata: { customTag: "some value" }
)

但是将元数据作为字符串化对象传递不会:

payment.archives.attach(
io: File.open("./archive.zip"),
filename: "archive.zip",
content_type: "application/gzip",
metadata: "{ "customTag": "some value" }"
)

此外,您可以将ActionDispatch::Http::UploadedFile对象作为参数传递给文档也不清楚的io:。在我的用例(我想还有很多其他用例)中,我有一个来自多部分表单请求的UploadedFile对象,需要为每个文件添加一些自定义属性。希望这能帮助那些在 5 年后迷失在 Legacy Rails 地狱中的人。

ActiveStorageblobs上的元数据不可查询 (https://github.com/rails/rails/issues/31780#issuecomment-360356381),您无法向其添加自定义属性。我觉得这有点限制。

似乎解决方案是您的第二个建议,即使用一个新的模型对象来包装files。此处对此进行了进一步解释:Rails 5.2 活动存储添加自定义属性

最新更新