На прошлой неделе клиент обратился к нам с сообщением, что через неделю после выполненной нами миграции отображалось только последнее изображение каждого поста. Мы провели расследование и обнаружили проблему.
В прошлом году PostUpload был заменён на UploadReference, и в коммите DEV: Update importers from PostUpload to UploadReference (#23681) · discourse/discourse@8a5d97e · GitHub многие импортеры были изменены для использования 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), чем переписывать логику вызова во всех этих местах?