From 76b5031bbfc1b154d7c9c28bf84923df8a04944d Mon Sep 17 00:00:00 2001 From: r888888888 Date: Thu, 13 Apr 2017 18:04:06 -0700 Subject: [PATCH] add uniqueness constraint on user names --- ...4005856_add_unique_name_constraint_to_users.rb | 6 ++++++ db/structure.sql | 2 ++ script/fixes/045_dedup_users.rb | 15 +++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 db/migrate/20170414005856_add_unique_name_constraint_to_users.rb create mode 100644 script/fixes/045_dedup_users.rb 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