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) }
Recommended Posts