class ResolveDuplicateGroupNames < ActiveRecord::Migration[4.2] def up results = Group.exec_sql 'SELECT id FROM groups WHERE name ILIKE (SELECT lower(name) FROM groups GROUP BY lower(name) HAVING count(*) > 1);' groups = Group.where id: results.map { |r| r['id'] } groups.group_by { |g| g.name.downcase }.each do |key, value| value.each_with_index do |dup, index| dup.update! name: "#{dup.name[0..18]}_#{index + 1}" if index > 0 end end end def down # does not reverse changes end end