我们已经在少数生产应用程序上使用了几周的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
然后使用文档模型来保存每个附加文件的信息。假设在本例中,合同有一个原始文档,但将来可能会有附加到它的附录,这些附录有自己独特的属性,我们希望跟踪这些属性。
有什么想法?
2条答案
按热度按时间kzmpq1sx1#
ActiveStorage
blobs
上的元数据是不可查询的(https://github.com/rails/rails/issues/31780#issuecomment-360356381),而且你不能向它们添加自定义属性。我觉得这有点限制。看起来解决方案是您的第二个建议,用一个新的模型对象来 Package
files
。下面将进一步解释:Rails 5.2 Active Storage add custom attributes0h4hbjxa2#
在这个问题被问到的时候,可能是元数据被覆盖了,就像Github issue中描述的那样。虽然元数据仍然是不可查询的(拜托,伙计们,已经过去了将近5年),但你肯定可以添加自定义属性。
奇怪的是,
attach()
函数parammetadata
在文档中说它应该是一个字符串,但它不起作用,并被分析器覆盖。如果你只是把它改为一个对象文字,它就起作用了,自定义元数据会与分析器元数据合并。这是可行的:
但是,将中继数据当做字串化对象传递并不会:
在我的用例中(我可以想象很多其他用例),我有一个来自多部分表单请求的
UploadedFile
对象,需要为每个文件添加一些自定义属性。希望这能帮助那些在5年后迷失在遗留Rails地狱中的人。