上周,一位客户联系我们,称在他们进行迁移一周后,只有每篇帖子的最后一张图片仍然显示。我们对此进行了调查,发现了一个问题。
去年,PostUpload 更改为 UploadReference,在提交 https://github.com/discourse/discourse/commit/8a5d97ef3f6f2d29a4e58b325f15b325c7d62986#diff-07ef93e0c499f6a6d5ce34607cb06a82ca03785d099391db9ea44bff30279727 中,许多导入器被更改为使用 UploadReference 而不是 PostUpload。
在大多数导入器中发现的模式是
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),而不是重写所有这些地方的调用逻辑?