【问题标题】:Rails ActiveStorage scope for when file is attached附加文件时的 Rails ActiveStorage 范围
【发布时间】:2018-11-07 23:24:51
【问题描述】:

使用 ActiveStorage 时,如何创建附加文件的范围。

例如:

class Check < ActiveRecord::Base
  has_one_attached :image
end

我希望像 Check.has_attached_image 这样的东西只返回存在现有附加图像的记录。

我知道ActiveStorage 提供了with_attached_image 范围。但这似乎不起作用:

irb(main):009:0> Check.with_attached_image.to_sql => "SELECT \"checks\".* FROM \"checks\""

【问题讨论】:

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


    【解决方案1】:

    with_attached_image 作用域的主要目的是避免 N+1 查询(在查询中包含附加的 blob)。

    要仅返回存在现有附加图像的记录,您可以在Check 模型中创建一个范围,如下所示:

    scope :has_attached_image, -&gt; { joins(image_attachment: :blob) }

    来自 cmets 的更新:

    scope :has_attached_image, -&gt; { joins(:image_attachment) }

    【讨论】:

    • 这更接近(因为它提供的结果更少),但它仍然返回我做check.image.attached? 并得到false 的结果。可能是因为之前附加了图像而现在没有?虽然无法确认……只是在构思。
    • @Ryan 你如何删除图片附件?你使用#purge这样的方法吗:check.image_attachment.purge
    • 不确定发生了什么,但现在无法重现。看起来这工作得很好。谢谢@Zoran Majstorovic!
    • 我不认为你也需要加入 blob,只需要附件。
    • 答案已更新以反映新发现,感谢@TomRossi
    猜你喜欢
    • 1970-01-01
    • 2019-02-18
    • 2021-05-02
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2018-06-17
    相关资源
    最近更新 更多