From 6d3d7b0bd133f2312a6eeac692adeb1182a9b520 Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 8 Oct 2021 05:17:01 -0500 Subject: [PATCH] Fix #4651: Favorites table contains duplicate favorites Add fix script to remove duplicate favorites. When a user has duplicate favorites on the same post, the earliest favorite will be kept and the rest will be removed. --- .../fixes/080_delete_duplicate_favorites.rb | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100755 script/fixes/080_delete_duplicate_favorites.rb diff --git a/script/fixes/080_delete_duplicate_favorites.rb b/script/fixes/080_delete_duplicate_favorites.rb new file mode 100755 index 000000000..b584c1d04 --- /dev/null +++ b/script/fixes/080_delete_duplicate_favorites.rb @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby + +require_relative "../../config/environment" + +Favorite.transaction do + 0.upto(99) do |i| + Favorite.where("user_id % 100 = #{i}").group(:post_id, :user_id).having("count(*) > 1").count.each do |(post_id, user_id), count| + favs = Favorite.where(post_id: post_id, user_id: user_id).order(:id) + + # Remove all duplicates, leaving the oldest favorite. + dupe_favs = favs.drop(1) + puts "user_id=#{user_id} post_id=#{post_id} count=#{count} keep=#{favs.first.id} drop=#{dupe_favs.map(&:id).join(",")}" + dupe_favs.each(&:delete) + + post = Post.find(post_id) + post.update_columns(fav_count: post.favorites.count) + + user = User.find(user_id) + user.update_columns(favorite_count: user.favorites.count) + end + end +end