我们已经在少数生产应用程序上使用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 活动存储添加自定义属性