[英]Rails 5.2 Active Storage add custom attributes
我有一個帶附件的模型:
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 次查詢(對項目圖像進行一次查詢,對每個圖像的ActiveStorage::Attachment
記錄進行一次查詢,對每個附加的ActiveStorage::Blob
多次查詢)。 為了清楚起見,我故意避免優化查詢數量。
如果您只需要對圖像進行排序,則可以自定義文件名並按文件名對圖像進行排序。 我使用我強烈推薦的羽絨寶石。
例如:
image = Down.download(image_url)
filename = "description-#{order}"
@object.images.attach(io: image, filename: filename)
然后在@object 的控制器中:
@images = @object.images_attachments.joins(:blob).order('active_storage_blobs.filename ASC')
然后在你看來@object
<%@images.each do |image|%>
<%= image_tag image%>
<% end %>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.