Заказать несколько изображений по имени файла в Active Storage Rails 5.2 - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть отношение has_many_attached к изображениям в модели Post.Я хочу упорядочить изображения по их имени при отображении на странице Post show.Как я могу заказать по имени файла?

Пример:

<% @post.images.order("id DESC").each do |image| %>

Можно ли просто заказать по имени через что-то вроде active_storage_blob.filename или что-то еще?

1 Ответ

0 голосов
/ 08 апреля 2019

Когда вы добавляете макрос 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, которые могли возникнуть из исходной версии.

...