Tengo un sitio donde parece que se han eliminado varios archivos de la tabla de subidas en la base de datos, pero aún existen en el sistema de archivos. Esto deja los enlaces rotos. He solucionado algunos volviendo a subir los archivos a un nuevo tema para crear el registro en la BD (en ese momento pensé que los archivos también faltaban, pero @angus amablemente me señaló por qué no los encontraba: ¡algún día preguntaré: por qué tenemos tanto nombres sha1 como base62 para todos estos activos?) y luego regenerando los posts que incluyen esas subidas, así:
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
Mi nuevo plan, dado que parece que los archivos existen en el sistema de archivos pero no en la base de datos, es hacer algo así:
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
¿Eso parece correcto? Estoy revisando uploads.rake y no veo nada que parezca hacer esto ya. Esto es más o menos lo contrario de
pero en lugar de FileUtils.rm(file_path) haría un Upload.create, creo.
Si esto parece realmente tonto o hay una solución mucho mejor, me encantaría escucharla antes de meterme en este pequeño laberinto.
Gracias.
No sé cómo ocurrió esto. Esperaba poder culpar a un plugin personalizado, pero temo que no es el caso. Podría estar relacionado con otra discusión, en la que alguien dijo: