diff --git a/db/migrate/20170414005856_add_unique_name_constraint_to_users.rb b/db/migrate/20170414005856_add_unique_name_constraint_to_users.rb new file mode 100644 index 000000000..e862805a4 --- /dev/null +++ b/db/migrate/20170414005856_add_unique_name_constraint_to_users.rb @@ -0,0 +1,6 @@ +class AddUniqueNameConstraintToUsers < ActiveRecord::Migration + def up + remove_index :users, :name + execute "create unique index index_users_on_name on users(lower(name))" + end +end diff --git a/db/structure.sql b/db/structure.sql index 0e5fb9a45..bd70439b7 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -7579,3 +7579,5 @@ INSERT INTO schema_migrations (version) VALUES ('20170330230231'); INSERT INTO schema_migrations (version) VALUES ('20170413000209'); +INSERT INTO schema_migrations (version) VALUES ('20170414005856'); + diff --git a/script/fixes/045_dedup_users.rb b/script/fixes/045_dedup_users.rb new file mode 100644 index 000000000..b83787d6b --- /dev/null +++ b/script/fixes/045_dedup_users.rb @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby + +require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'config', 'environment')) + +ActiveRecord::Base.connection.execute("set statement_timeout = 0") + +candidates = User.group("lower(name)").having("count(*) > 1").pluck("lower(name)") + +candidates.each do |name| + users = User.where("lower(name) = ?", name).order("id").to_a + users.slice(1, 100).each do |user| + user.name = "dup_#{user.name}_#{user.id}" + user.save! + end +end