先週、クライアントから、移行から1週間後に、投稿の最後の画像のみが表示されているという連絡がありました。調査したところ、問題が見つかりました。
昨年、PostUpload は UploadReference に変更され、コミット https://github.com/discourse/discourse/commit/8a5d97ef3f6f2d29a4e58b325f15b325c7d62986#diff-07ef93e0c499f6a6d5ce34607cb06a82ca03785d099391db9ea44bff30279727 で、多くのインポーターが PostUpload の代わりに UploadReference を使用するように変更されました。
ほとんどのインポーターで見つかったパターンは次のとおりです。
def import_attachments
# ... アップロードとその投稿を取得
uploads.each do |upl|
# ... ファイルをアップロード
# ... 対応する投稿を検索
UploadReference.ensure_exist!(upload_ids: [upload.id], target: post)
end
end
これは、一見すると良さそうに見えます。
しかし、UploadReference.ensure_exist! は、その投稿に対する他のアップロード参照が存在しないことも確認します。
したがって、1つの投稿に対して UploadReference.ensure_exist! を複数回使用すると、最後のアップロード参照のみが保持されます。
関数の名前からすると、これらの場所の呼び出しロジックをすべて書き直すのではなく、実際の Сахалин (実装) を変更する (delete_all を削除する) のが最善ではないでしょうか?