La settimana scorsa un cliente ci ha contattato affermando che una settimana dopo una migrazione che abbiamo eseguito per loro, veniva ancora visualizzata solo l’ultima immagine di ogni post. Abbiamo approfondito la questione e abbiamo trovato un problema.
L’anno scorso, PostUpload è stato cambiato in UploadReference e nel commit https://github.com/discourse/discourse/commit/8a5d97ef3f6f2d29a4e58b325f15b325c7d62986#diff-07ef93e0c499f6a6d5ce34607cb06a82ca03785d099391db9ea44bff30279727 molti importatori sono stati modificati per utilizzare UploadReference invece di PostUpload.
Il pattern trovato nella maggior parte degli importatori è
def import_attachments
# ... recupera caricamenti e i loro post
uploads.each do |upl|
# ... carica file
# ... trova post corrispondente
UploadReference.ensure_exist!(upload_ids: [upload.id], target: post)
end
end
il che sembra carino e a posto.
Tuttavia, UploadReference.ensure_exist! si assicura anche che non esistano altri riferimenti di caricamento a quel post.
Pertanto, l’utilizzo di UploadReference.ensure_exist! più volte su un singolo post manterrà solo l’ultimo riferimento di caricamento.
Dato il nome della funzione, sarebbe probabilmente meglio cambiare l’implementazione effettiva (rimuovendo il delete_all) invece di riscrivere la logica di chiamata in tutti questi posti?