Ho un sito in cui sembra che un sacco di upload siano stati rimossi dalla tabella uploads nel database, ma esistano ancora nel filesystem. Questo lascia i link ad essi rotti. Ne ho risolti alcuni ricaricando i file in un nuovo topic per creare il record nel DB (all’epoca pensavo che i file mancassero anch’essi, ma @angus ha gentilmente indicato perché non li trovavo—Un giorno chiederò: perché abbiamo sia nomi sha1 che base62 per tutte queste risorse?) e poi rigenerando i post che includono quegli upload, così:
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
Il mio nuovo piano, dato che sembra che i file esistano nel filesystem ma non nel database, è fare qualcosa del genere:
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
Sembra corretto? Sto esaminando uploads.rake e non vedo nulla che faccia già questo. È un po’ l’opposto di
ma invece di FileUtils.rm(file_path) farei un Upload.create, credo.
Se sembra davvero stupido o c’è una soluzione molto migliore, mi piacerebbe saperlo prima di addentrarmi in questa piccola tana del coniglio.
Grazie.
Non so come sia successo. Speravo di poter dare la colpa a un plugin personalizzato, ma temo non sia così. Potrebbe essere correlato a un’altra discussione, in cui qualcuno ha detto: