Tenho um site onde parece que vários uploads foram removidos da tabela uploads no banco de dados, mas ainda existem no sistema de arquivos. Isso deixa os links para esses arquivos quebrados. Corrigi alguns reenviando os arquivos para um novo tópico, criando assim o registro no banco de dados (na época eu achava que os arquivos também estavam faltando, mas @angus gentilmente apontou por que eu não os encontrava — Um dia vou perguntar: por que temos tanto nomes sha1 quanto base62 para todos esses ativos?) e depois reprocessando os posts que incluem esses uploads, assim:
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
Meu novo plano, já que parece que os arquivos existem no sistema de arquivos, mas não no banco de dados, é fazer algo assim:
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
Isso parece correto? Estou analisando uploads.rake e não vejo nada que faça isso já. Isso é meio que o oposto de
mas, em vez de FileUtils.rm(file_path), eu faria um Upload.create, acredito.
Se isso parecer muito absurdo ou se houver uma solução muito melhor, adoraria ouvir antes de entrar nessa pequena toca de coelho.
Obrigado.
Não sei como isso aconteceu. Eu esperava culpar um plugin personalizado, mas temo que não seja o caso. Pode estar relacionado a outra discussão, em que alguém disse: