mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-10-31 08:26:31 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # 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(my_modules.id)>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
 |