[RAILS] Recherchez les fichiers qui ont été suspendus sans être supprimés

Lors de la gestion des fichiers téléchargés en utilisant Active Storage, il y a pour une raison quelconque un problème entre les tables gérées (ʻactive_storage_blobs, ʻactive_storage_attachments) et les fichiers réellement stockés dans le stockage (fichiers réels). Une cohérence peut se produire.

Parmi eux, si seulement ʻactive_storage_attachments est supprimé et que les ʻactive_storage_blobs associés et le fichier réel restent, la portée ʻActiveStorage :: Blob.unattached` peut être utilisée.

❯ rails c
Loading development environment (Rails 5.2.4.4)
[1] pry(main)> ActiveStorage::Blob.unattached
  ActiveStorage::Blob Load (1.0ms)  SELECT "active_storage_blobs".* FROM "active_storage_blobs" LEFT OUTER JOIN "active_storage_attachments" ON "active_storage_attachments"."blob_id" = "active_storage_blobs"."id" WHERE "active_storage_attachments"."blob_id" IS NULL

Vous pouvez l'utiliser pour supprimer le fichier réel associé à l'enregistrement pendant ʻactive_storage_blobs` comme indiqué ci-dessous.

[1] pry(main)> ActiveStorage::Blob.unattached.each(&:purge)
  ActiveStorage::Blob Load (1.0ms)  SELECT "active_storage_blobs".* FROM "active_storage_blobs" LEFT OUTER JOIN "active_storage_attachments" ON "active_storage_attachments"."blob_id" = "active_storage_blobs"."id" WHERE "active_storage_attachments"."blob_id" IS NULL
   (0.3ms)  BEGIN
  ActiveStorage::Attachment Exists (0.2ms)  SELECT  1 AS one FROM "active_storage_attachments" WHERE "active_storage_attachments"."blob_id" = $1 LIMIT $2  [["blob_id", 1], ["LIMIT", 1]]
  ActiveStorage::Blob Destroy (0.5ms)  DELETE FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = $1  [["id", 1]]
   (0.8ms)  COMMIT
  S3 Storage (105.5ms) Deleted file from key: ...
=> nil

Il est défini dans la classe ʻActiveStorage :: Blob comme la portée de ʻunattached comme suit. (À partir de Rails v5.2)

activestorage/app/models/active_storage/blob.rb


class ActiveStorage::Blob < ActiveRecord::Base
  ... 

  has_many :attachments

  scope :unattached, -> { left_joins(:attachments).where(ActiveStorage::Attachment.table_name => { blob_id: nil }) }

  ...
end

Remarque: La branche master à ce moment semble contenir un commit qui se modifie pour utiliser la méthode missing.

activestorage/app/models/active_storage/blob.rb


@@ -46,7 +46,7 @@ class ActiveStorage::Blob < ActiveRecord::Base
 
   has_many :attachments
 
-  scope :unattached, -> { left_joins(:attachments).where(ActiveStorage::Attachment.table_name => { blob_id: nil }) }
+  scope :unattached, -> { where.missing(:attachments) }

référence

Recommended Posts

Recherchez les fichiers qui ont été suspendus sans être supprimés