web-dev-qa-db-ja.com

Rails 5.2 Active Storageはカスタム属性を追加します

私は添付ファイル付きのモデルを持っています:

_class Project < ApplicationRecord
  has_many_attached :images
end
_

画像を添付して保存するとき、追加のカスタム属性-_display_order_(整数)を添付画像とともに保存したいと思います。これを使用して、添付画像をソートし、このカスタム属性で指定した順序で表示します。 _#attach_メソッドと_ActiveStorage::Blob_モデルのActiveStorageソースコードを確認しましたが、カスタムメタデータを渡すための組み込みメソッドはないようです。

ActiveStorageでこの問題を解決する慣用的な方法は何でしょうか?以前は、通常、添付ファイルを表すActiveRecordモデルに_display_order_属性を追加し、.order(display_order: :asc)クエリで使用するだけでした。

15
paxer

各画像に追加データを保存し、そのデータに基づいてクエリを実行する必要がある場合は、添付されたImageをラップするfileモデルを抽出することをお勧めします。

# 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個の画像を含むプロジェクトに対して2N + 1クエリが発生します(1つのクエリはプロジェクトの画像、もう1つのクエリは各画像のActiveStorage::Attachmentレコード、および添付された各ActiveStorage::Blob)。明確にするために、クエリ数の最適化を意図的に避けました。

16
George Claghorn