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

nhhxz33t  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(109)

我们已经在少数生产应用程序上使用了几周的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

然后使用文档模型来保存每个附加文件的信息。假设在本例中,合同有一个原始文档,但将来可能会有附加到它的附录,这些附录有自己独特的属性,我们希望跟踪这些属性。
有什么想法?

kzmpq1sx

kzmpq1sx1#

ActiveStorage blobs上的元数据是不可查询的(https://github.com/rails/rails/issues/31780#issuecomment-360356381),而且你不能向它们添加自定义属性。我觉得这有点限制。
看起来解决方案是您的第二个建议,用一个新的模型对象来 Package files。下面将进一步解释:Rails 5.2 Active Storage add custom attributes

0h4hbjxa

0h4hbjxa2#

在这个问题被问到的时候,可能是元数据被覆盖了,就像Github issue中描述的那样。虽然元数据仍然是不可查询的(拜托,伙计们,已经过去了将近5年),但你肯定可以添加自定义属性。
奇怪的是,attach()函数param 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\" }"
)

在我的用例中(我可以想象很多其他用例),我有一个来自多部分表单请求的UploadedFile对象,需要为每个文件添加一些自定义属性。希望这能帮助那些在5年后迷失在遗留Rails地狱中的人。

相关问题