# frozen_string_literal: true class RemoveDuplicatePoints < ActiveRecord::Migration[8.0] def up # Find duplicate groups using a subquery duplicate_groups = Point.select('latitude, longitude, timestamp, user_id, COUNT(*) as count') .group('latitude, longitude, timestamp, user_id') .having('COUNT(*) > 1') puts "Duplicate groups found: #{duplicate_groups.length}" duplicate_groups.each do |group| points = Point.where( latitude: group.latitude, longitude: group.longitude, timestamp: group.timestamp, user_id: group.user_id ).order(id: :asc) # Keep the latest record and destroy all others latest = points.last points.where.not(id: latest.id).destroy_all end end def down # This migration cannot be reversed raise ActiveRecord::IrreversibleMigration end end