Ich habe eine Seite, bei der anscheinend eine Reihe von Uploads aus der uploads-Tabelle in der Datenbank entfernt wurden, aber im Dateisystem noch existieren. Dadurch sind die Links zu diesen Dateien defekt. Ich habe einige behoben, indem ich die Dateien erneut in ein neues Thema hochgeladen habe, um den Datensatz in der DB zu erstellen (zuerst dachte ich, die Dateien seien ebenfalls verschwunden, aber @angus hat mir freundlicherweise erklärt, warum ich sie nicht finden konnte – eines Tages werde ich fragen: Warum haben wir für all diese Assets sowohl sha1- als auch base62-Namen?) und anschließend die Beiträge, die diese Uploads enthalten, neu gerendert (rebaked), wie folgt:
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
Mein neuer Plan, da die Dateien scheinbar im Dateisystem, aber nicht in der Datenbank vorhanden sind, ist, etwas Ähnliches zu tun:
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
Klingt das vernünftig? Ich schaue mir uploads.rake an und finde nichts, das dies bereits erledigt. Das ist sozusagen das Gegenteil von
aber anstatt FileUtils.rm(file_path) würde ich stattdessen Upload.create verwenden, denke ich.
Wenn das wirklich dumm klingt oder es eine viel bessere Lösung gibt, würde ich mich freuen, das vorab zu hören, bevor ich mich in dieses kleine Kaninchenloch stürze.
Vielen Dank.
Ich weiß nicht, wie das passiert ist. Ich hatte gehofft, die Schuld einem benutzerdefinierten Plugin zuschieben zu können, aber ich fürchte, das ist nicht der Fall. Es könnte mit einer anderen Diskussion zusammenhängen, in der jemand sagte: