Rails 5.2 Active Storage添加自定义属性

我有一个带附件的模型:

class Project < ApplicationRecord has_many_attached :images end 

当我附加并保存图像时,我还想保存一个附加的自定义属性 – display_order (整数)和附加的图像。 我想用它来对附加的图像进行排序,并按照我在此自定义属性中指定的顺序显示它们。 我已经回顾了#attach方法的ActiveStorage源代码以及ActiveStorage::Blob模型,但看起来没有内置方法来传递一些自定义元数据。

我想知道,使用ActiveStorage解决这个问题的惯用方法是什么? 在过去,我通常会将一个display_order属性添加到ActiveRecord模型中,该模型代表我的附件,然后只需将它与.order(display_order: :asc)查询一起使用。

如果您需要为每个图像存储其他数据并根据该数据执行查询,我建议您提取一个包装附件的Image模型:

 # app/models/project.rb class Project < ApplicationRecord has_many :images, dependent: :destroy end 
 # app/models/image.rb class Image < ApplicationRecord belongs_to :project has_one_attached :file delegate_missing_to :file scope :positioned, -> { order(position: :asc) } end 
 <%# app/views/projects/show.html.erb %> <% @project.images.positioned.each do |image| %> <%= image_tag image %> <% end %> 

请注意,上面的示例视图对具有N个图像的项目(项目图像的一个查询,每个图像的ActiveStorage::Attachment记录的另一个查询,以及每个附加的ActiveStorage::Blob一个查询)导致2N + 1个查询。 为清晰起见,我故意避免优化查询数量。