# frozen_string_literal: true # On production around 2k records for repair, for production DB it tooked cca 1 min # rubocop:disable Metrics/BlockLength namespace :my_modules do desc 'Find new positions on canvas for already taken coordiantes' task fix_positions: :environment do query = MyModule.select('COUNT(*) as duplicates', :x, :y, :experiment_id) .where(archived: false) .group(:x, :y, :experiment_id) .having('COUNT(*)>1') Rails.logger.info '*********************************************************************************' Rails.logger.info "You have to relocate #{query.sum { |a| a.duplicates - 1 }} tasks" Rails.logger.info '*********************************************************************************' query.each do |row| tasks_to_update = MyModule.where(experiment_id: row.experiment, x: row.x, y: row.y, archived: false) .order(created_at: :asc) .offset(1) tasks_to_update.find_each do |task| coordinates = task.get_new_position task.attributes = coordinates begin task.save! Rails.logger.info "Relocated task with ID #{task.id}" rescue ActiveRecord::RecordInvalid => e Rails.logger.error "Unable to save task with ID #{task.id}: #{e.message}" end end end Rails.logger.info '*********************************************************************************' Rails.logger.info "You have #{query.reload.sum { |a| a.duplicates - 1 }} tasks on invalid positions" Rails.logger.info '*********************************************************************************' end end # rubocop:enable Metrics/BlockLength