Ошибка UploadReference во многих импортерах

На прошлой неделе клиент обратился к нам с сообщением, что через неделю после выполненной нами миграции отображалось только последнее изображение каждого поста. Мы провели расследование и обнаружили проблему.

В прошлом году 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), чем переписывать логику вызова во всех этих местах?

@david @nbianca

3 лайка