La semaine dernière, un client nous a contactés, indiquant qu’une semaine après une migration que nous avions effectuée pour lui, seule la dernière image de chaque publication était encore visible. Nous avons enquêté et trouvé un problème.
L’année dernière, PostUpload a été remplacé par UploadReference et dans le commit https://github.com/discourse/discourse/commit/8a5d97ef3f6f2d29a4e58b325f15b325c7d62986#diff-07ef93e0c499f6a6d5ce34607cb06a82ca03785d099391db9ea44bff30279727, de nombreux importateurs ont été modifiés pour utiliser UploadReference au lieu de PostUpload.
Le modèle trouvé dans la plupart des importateurs est
def import_attachments
# ... obtenir les téléversements et leurs publications
uploads.each do |upl|
# ... téléverser le fichier
# ... trouver la publication correspondante
UploadReference.ensure_exist!(upload_ids: [upload.id], target: post)
end
end
ce qui semble bien et correct.
Cependant, UploadReference.ensure_exist! s’assure également qu’aucune autre référence de téléversement n’existe pour cette publication.
Par conséquent, l’utilisation de UploadReference.ensure_exist! plusieurs fois sur une seule publication ne conservera que la dernière référence de téléversement.
Compte tenu du nom de la fonction, il serait probablement préférable de modifier l’implémentation réelle (en supprimant le delete_all) plutôt que de réécrire la logique d’appel à tous ces endroits ?