diff --git a/app/models/upload.rb b/app/models/upload.rb index 1a8b747c7..30db046a1 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -100,7 +100,7 @@ class Upload < ApplicationRecord end media_asset = MediaAsset.upload!(media_file) - update!(media_assets: [media_asset], status: "completed") + update!(media_assets: [media_asset], status: "completed", media_asset_count: 1) rescue Exception => e update!(status: "error", error: e.message) end diff --git a/script/fixes/101_fix_media_asset_count.rb b/script/fixes/101_fix_media_asset_count.rb new file mode 100755 index 000000000..82183d5be --- /dev/null +++ b/script/fixes/101_fix_media_asset_count.rb @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby + +require_relative "base" + +with_confirmation do + # Fix uploads that have a non-zero media_asset_count but no media assets. + records = Upload.where("media_asset_count != 0").where.not(id: UploadMediaAsset.select(:upload_id).distinct) + puts "Fixing #{records.size} records" + records.update_all(media_asset_count: 0) +end + +with_confirmation do + # Fix uploads that have a media_asset_count inconsistent with the upload_media_assets table. + records = Upload.find_by_sql(<<~SQL.squish) + UPDATE uploads + SET media_asset_count = true_count + FROM ( + SELECT upload_id, COUNT(*) AS true_count + FROM upload_media_assets + GROUP BY upload_id + ) true_counts + WHERE uploads.id = upload_id AND uploads.media_asset_count != true_count + RETURNING uploads.* + SQL + + puts "Fixing #{records.size} records" +end