Когда вы добавляете макрос has_many_attached в класс, он фактически добавляет следующие отношения к вашему классу
class Post < ApplicationRecord
has_many :image_attachments, -> { where(name: 'image') }, class_name: "ActiveStorage::Attachment", as: :record, inverse_of: :record, dependent: false
has_many :image_blobs, through: :image_attachments, class_name: "ActiveStorage::Blob", source: :blob
end
Это означает, что мы можем использовать отношение для обработки сортировки по filename
, что на самом деле является атрибутомActiveStorage::Blob
, а не вложение.Чтобы сделать это, мы ссылаемся на отношение, определенное макросом images
в вашем случае, а затем join
на его естественное отношение к ActiveStorage::Blob
, чтобы мы могли сортировать по этим полям.
Окончательный результат будет
<% @post.images.joins(:blobs).order('active_storage_blobs.filename ASC').each do |image| %>
Теперь все изображения будут отсортированы по имени файла, однако, поскольку объединения не загружают какие-либо данные, и я предполагаю, что вы ссылаетесь на файлимя, по вашему мнению, мы могли бы также использовать
<% @post.images.includes(:blobs).references(:blobs).order('active_storage_blobs.filename ASC').each do |image| %>
, чтобы иметь один запрос, который загружает изображения и данные ActiveStorage::Blob
одновременно, чтобы избежать проблем n + 1, которые могли возникнуть из исходной версии.