J’ai un site où il semble qu’un certain nombre de fichiers téléchargés aient été supprimés de la table uploads dans la base de données, mais qu’ils existent toujours dans le système de fichiers. Cela laisse les liens vers ces fichiers brisés. J’en ai réparé quelques-uns en téléchargeant à nouveau les fichiers dans un nouveau sujet pour créer l’enregistrement dans la base de données (à l’époque, je pensais que les fichiers étaient manquants, mais @angus a gentiment expliqué pourquoi je ne les trouvais pas — Un jour, je demanderai : pourquoi avons-nous à la fois des noms sha1 et base62 pour tous ces actifs ?), puis en relançant la génération des publications qui incluent ces téléchargements, comme ceci :
def rebake_posts_with_uploads(topic_id, post_number)
p = Post.find_by(topic_id: topic_id, post_number: post_number)
exit unless p
re = /upload:\/\/(.+?)\)/
shas= p.raw.scan(re)
shas.each do |sha|
posts = Post.where("raw like '%#{sha[0]}%'")
next unless posts
puts "Found #{posts.count - 1} #{sha[0]}"
posts.each do |post|
next if post.id == p.id
puts "rebake #{post.id}--#{BASE_URL}/t/-/#{post.topic_id}/#{post.post_number}"
post.rebake!
end
end
end
Mon nouveau plan, puisque les fichiers semblent exister dans le système de fichiers mais pas dans la base de données, est de faire quelque chose comme ceci :
for (all files in /shared/uploads/default/original/1x) do |file|
unless file is in uploads table
create upload record
for each post that includes that upload record
rebake
Est-ce que cela semble correct ? Je consulte uploads.rake et je ne vois rien qui semble déjà faire cela. C’est en quelque sorte l’inverse de
mais au lieu de FileUtils.rm(file_path), je ferais plutôt un Upload.create, je pense.
Si cela semble vraiment stupide ou s’il existe une bien meilleure solution, j’aimerais beaucoup l’entendre avant de m’engager dans cette petite impasse.
Merci.
Je ne sais pas comment cela a pu arriver. J’espérais pouvoir accuser un plugin personnalisé, mais je crains que ce ne soit pas le cas. Cela pourrait être lié à une autre discussion, dans laquelle quelqu’un a dit :