У меня есть сайт, где, похоже, множество загрузок были удалены из таблицы uploads в базе данных, но всё ещё существуют в файловой системе. Из-за этого ссылки на них сломаны. Я исправил несколько, загрузив файлы заново в новую тему, чтобы создать запись в БД (сначала я думал, что файлы тоже отсутствуют, но @angus любезно указал, почему я их не находил — когда-нибудь спрошу: зачем у нас есть и sha1, и base62 имена для всех этих ресурсов?), а затем пересобрал посты, включающие эти загрузки, вот так:
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
Мой новый план, поскольку файлы, похоже, существуют в файловой системе, но отсутствуют в базе данных, заключается в следующем:
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
Это кажется правильным? Я смотрю на uploads.rake и не вижу ничего, что уже делало бы это. Это своего рода обратная версия
но вместо FileUtils.rm(file_path) я бы, думаю, использовал Upload.create.
Если это кажется совсем глупым или есть гораздо лучшее решение, буду рад услышать его, прежде чем углубляться в эту кроличью нору.
Спасибо.
Я не знаю, как это произошло. Я надеялся возложить вину на кастомный плагин, но боюсь, что это не так. Возможно, это связано с другим обсуждением, где кто-то сказал: