私は添付ファイル付きのモデルを持っています:
_class Project < ApplicationRecord
has_many_attached :images
end
_
画像を添付して保存するとき、追加のカスタム属性-_display_order
_(整数)を添付画像とともに保存したいと思います。これを使用して、添付画像をソートし、このカスタム属性で指定した順序で表示します。 _#attach
_メソッドと_ActiveStorage::Blob
_モデルのActiveStorageソースコードを確認しましたが、カスタムメタデータを渡すための組み込みメソッドはないようです。
ActiveStorageでこの問題を解決する慣用的な方法は何でしょうか?以前は、通常、添付ファイルを表すActiveRecordモデルに_display_order
_属性を追加し、.order(display_order: :asc)
クエリで使用するだけでした。
各画像に追加データを保存し、そのデータに基づいてクエリを実行する必要がある場合は、添付された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
)。明確にするために、クエリ数の最適化を意図的に避けました。