ActiveStorage blob文件名上的Rails范围给出错误结果

时间:2018-10-11 06:42:08

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

我有以下使用ActiveStorage的模型:

class ProofreadDocument < ApplicationRecord

  has_one_attached :file
  has_many   :paragraphs, dependent: :destroy

      scope :with_file_named, -> (filename) { 
includes(:paragraphs).joins(file_attachment: 
:blob).where("active_storage_blobs.filename = ?", filename).first}

当记录具有匹配的文件名时,它可以很好地工作。但是,当我搜索文件名不存在的记录时,它将返回所有记录。

    pry(main)> ProofreadDocument.with_file_named("M6").count
      ProofreadDocument Load (6.9ms)  SELECT  "proofread_documents".* FROM 
"proofread_documents" INNER JOIN "active_storage_attachments" ON 
"active_storage_attachments"."record_id" = "proofread_documents"."id" AND 
"active_storage_attachments"."record_type" = $1 AND 
"active_storage_attachments"."name" = $2 INNER JOIN "active_storage_blobs" 
ON "active_storage_blobs"."id" = "active_storage_attachments"."blob_id" 
WHERE (active_storage_blobs.filename = 'M6') ORDER BY 
"proofread_documents"."id" ASC LIMIT $3  [["record_type", 
"ProofreadDocument"], ["name", "file"], ["LIMIT", 1]]
(0.5ms)  SELECT COUNT(*) FROM "proofread_documents"

=> 576

如何解决此问题,以便在给定文件名没有记录的情况下返回0条记录?

1 个答案:

答案 0 :(得分:0)

您的范围返回一个记录对象或nil。对于the docs for the scope macro,范围应返回ActiveRecord::Relation;当它返回nil时(就像没有二进制文件给定文件名时一样),它等效于all(加了强调):

  

添加用于检索和查询对象的类方法。该方法旨在返回ActiveRecord :: Relation对象,该对象可与其他作用域组成。 如果返回nilfalse,则返回all范围。

通过删除对first的调用来修改范围以返回关系:

scope :with_file_named, -> (filename) do
  includes(:paragraphs).joins(file_attachment: :blob).where("active_storage_blobs.filename = ?", filename)
end
相关问题