Rails 5.2 Active Storage agrega atributos personalizados

Tengo un modelo con archivos adjuntos:

class Project < ApplicationRecord has_many_attached :images end 

Cuando adjunto y guardo la imagen, también quiero guardar un atributo personalizado adicional – display_order (entero) con la imagen adjunta. Quiero usarlo para ordenar las imágenes adjuntas y mostrarlas en el orden especificado en este atributo personalizado. He revisado el código fuente de ActiveStorage para el método #attach , así como para el modelo ActiveStorage::Blob , pero parece que no hay un método incorporado para pasar algunos metadatos personalizados.

Me pregunto, ¿cuál es la forma idiomática de resolver este problema con ActiveStorage? En el pasado, por lo general solo agregaría un atributo display_order al modelo ActiveRecord que representa mi archivo adjunto y luego lo usaría con la consulta .order(display_order: :asc) .

Si necesita almacenar datos adicionales con cada imagen y realizar consultas basadas en esos datos, recomiendo extraer un modelo de Image que contenga un file adjunto:

 # 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 %> 

Tenga en cuenta que la vista de ejemplo anterior causa 2N + 1 consultas para un proyecto con N imágenes (una consulta para las imágenes del proyecto, otra para el registro de ActiveStorage::Attachment de ActiveStorage::Attachment cada imagen, y una más para cada ActiveStorage::Blob adjunto). Evité deliberadamente la optimización del número de consultas por motivos de claridad.