사이트에서 데이터베이스의 uploads 테이블에서 여러 업로드 기록이 삭제되었지만 파일 시스템에는 여전히 존재하는 것으로 보입니다. 이로 인해 해당 링크들이 깨진 상태가 되었습니다. 저는 DB에 기록을 생성하기 위해 새 주제에 파일을 다시 업로드하는 방식으로 몇 개를 수정했습니다(당시에는 파일 자체도 사라진 줄 알았지만, @angus가 제가 파일을 찾지 못한 이유를 친절하게 알려주었습니다. 언젠가 물어볼게요: 왜 이 모든 에셋에 sha1 그리고 base62 이름이 둘 다 있나요?) 그런 다음 해당 업로드를 포함하는 게시글을 다음과 같이 다시 생성(rebake)했습니다:
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
파일 시스템에는 파일이 있지만 데이터베이스에는 없는 것으로 보이므로, 제 새로운 계획은 다음과 같은 작업을 수행하는 것입니다:
/shared/uploads/default/original/1x의 모든 파일에 대해 |file|
uploads 테이블에 파일이 없다면
업로드 기록 생성
해당 업로드 기록을 포함하는 각 게시글에 대해
다시 생성(rebake)
이렇게 하는 것이 맞을까요? uploads.rake를 보고 있지만, 이미 이런 작업을 수행하는 내용은 보이지 않습니다. 이것은 다음과 같은 것과 약간 반대되는 개념입니다:
다만 FileUtils.rm(file_path) 대신 Upload.create를 수행하는 것이라고 생각합니다.
이 방법이 정말 멍청해 보이거나 훨씬 나은 해결책이 있다면, 이 작은 토끼굴에 들어가기 전에 듣고 싶습니다.
감사합니다.
이런 일이 어떻게 일어났는지 모르겠습니다. 커스텀 플러그인의 탓으로 돌리기를 바랐지만, 안타깝게도 그런 경우가 아닙니다. 다른 토론과 관련이 있을 수 있는데, 거기서 누군가가 이렇게 말했습니다: