【问题标题】:Rails 5.2 Active Storage add custom attributesRails 5.2 Active Storage 添加自定义属性
【发布时间】:2018-09-05 16:53:22
【问题描述】:

我有一个带附件的模型:

class Project < ApplicationRecord
  has_many_attached :images
end

当我附加并保存图像时,我还想保存一个附加的自定义属性 - display_order(整数)和附加的图像。我想用它对附加的图像进行排序,并按照我在此自定义属性中指定的顺序显示它们。我已经查看了 #attach 方法和 ActiveStorage::Blob 模型的 ActiveStorage 源代码,但看起来没有内置方法可以传递一些自定义元数据。

我想知道,用 ActiveStorage 解决这个问题的惯用方法是什么?过去,我通常只在 ActiveRecord 模型中添加一个 display_order 属性来表示我的附件,然后简单地将其与 .order(display_order: :asc) 查询一起使用。

【问题讨论】:

    标签: ruby-on-rails ruby rails-activestorage


    【解决方案1】:

    如果您只需要订购图片,您可以自定义文件名并按文件名订购图片。我使用我强烈推荐的羽绒宝石。

    例如:

    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 %>
    

    【讨论】:

      【解决方案2】:

      如果您需要为每个图像存储额外的数据并根据该数据执行查询,我建议您提取一个包装了附加的fileImage 模型:

      # 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 查询)。为了清楚起见,我故意避免优化查询数量。

      【讨论】:

      • 有没有什么有效的方法来使用这个解决方案来使用“with_attached_#{}”宏?
      • @Richard,您可以使用ActiveRecord::Base#includes#merge 定义您自己的with_attached_images 范围。这是一个更完整的例子:gist.github.com/georgeclaghorn/9baf3b9f1796eed5a983d35825b7f86c
      • 非常感谢你的例子,明天试试这个!
      • 嗨@GeorgeClaghorn。我只是偶然发现了这篇调查类似需求的帖子。我已经实现了用户旋转和裁剪功能。为了使其工作,这些值需要保存在数据库中并由渲染时的活动存储调用。在未来的活动存储版本中,是否可以通过附件保存其他属性?
      猜你喜欢
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 2018-11-22
      • 2018-09-28
      • 2019-07-13
      • 1970-01-01
      相关资源
      最近更新 更多