Область применения Rails в имени файла BLOB-объекта ActiveStorage дает ошибочные результаты - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующая модель, которая использует 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 голосов
/ 12 октября 2018

Ваша область возвращает объект записи или nil.В соответствии с документами для макроса scope область должна возвращать ActiveRecord::Relation;когда он возвращает nil, как ваш, когда ни у какого BLOB-объекта нет заданного имени файла, это эквивалентно all (выделение добавлено):

Добавляет метод класса для извлечения и запроса объектов.Метод предназначен для возврата объекта ActiveRecord :: Relation, который можно комбинировать с другими областями. Если он возвращает nil или false, вместо него возвращается область all.

Измените область, чтобы она возвращала отношение, удалив вызов first:

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