簡體   English   中英

Rails 5.2 Active Storage 添加自定義屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM