namespace :yeet_dba do
desc 'Show all of the tables.columns with bad data' task find_invalid_columns: :environment do columns = YeetDba::MissingForeignKeys.invalid_columns puts puts '---RESULTS---' puts if columns.empty? puts 'All good here. 👍' else puts "🚨Houston, we have a problem 🚨. We found #{columns.length} invalid column#{columns.length == 1 ? '' : 's'}." puts columns.each do |invalid_column| puts "-> #{invalid_column.table_name}.#{invalid_column.column}" puts "Invalid rows: #{invalid_column.orphaned_rows_count}" puts "Foreign table: #{invalid_column.association_table_name}" puts puts 'This query should return no results:' puts invalid_column.query puts end end end desc 'Set all of the rows to null if there is bad data' task nullify_or_destroy_invalid_rows: :environment do columns = YeetDba::MissingForeignKeys.invalid_columns next puts "Your data looks good!" if columns.empty? columns.each do |column| puts column.to_s end puts puts "WARNING - THIS MAY CAUSE PERM DATA LOSS" puts puts "I am going to give you 8s to change your mind" sleep 8 puts "ok, here we go..." sleep 1 columns.each do |invalid_column| required = invalid_column.column.association.options&.key?(:optional) ? !invalid_column.column.association.options[:optional] : invalid_column.column.model.belongs_to_required_by_default nullable = invalid_column.column.db_column.null if required # delete invalid_column.verify_data.orphaned_rows.destroy_all elsif nullable # null it out invalid_column.verify_data.orphaned_rows.update_all(invalid_column.db_column.name => nil) else puts "WARNING - #{invalid_column.table_name} . #{invalid_column.db_column.name} is not nullable" end end end
end