지난주 한 고객이 우리에게 연락하여, 우리가 수행한 마이그레이션 후 일주일 만에 모든 게시물의 마지막 이미지만 표시되고 있다고 보고했습니다. 우리는 이 문제를 조사하여 원인을 찾았습니다.
지난해 PostUpload가 UploadReference로 변경되었고, 커밋 DEV: Update importers from PostUpload to UploadReference (#23681) · discourse/discourse@8a5d97e · GitHub 에서 많은 임포터가 PostUpload 대신 UploadReference를 사용하도록 변경되었습니다.
대부분의 임포터에서 발견되는 패턴은 다음과 같습니다.
def import_attachments
# ... 업로드와 해당 게시물 가져오기
uploads.each do |upl|
# ... 업로드 파일
# ... 해당 게시물 찾기
UploadReference.ensure_exist!(upload_ids: [upload.id], target: post)
end
end
이것은 좋아 보이고 문제 없어 보입니다.
그러나 UploadReference.ensure_exist!는 해당 게시물에 다른 업로드 참조가 존재하지 않도록도 보장합니다.
따라서 단일 게시물에 대해 UploadReference.ensure_exist!를 여러 번 사용하면 마지막 업로드 참조만 유지됩니다.
함수 이름에 비추어 볼 때, 모든 이러한 위치에서 호출 로직을 다시 작성하는 것보다 실제 구현을 변경하는 것(즉, delete_all 제거)이 가장 좋을 것입니다.