Simpler way of renaming users

This commit is contained in:
Bob Van Landuyt 2017-05-19 17:22:45 +02:00
parent 84f8cd1718
commit 51913c32ba
2 changed files with 10 additions and 10 deletions

View file

@ -26,15 +26,12 @@ class RenameUsersWithRenamedNamespace < ActiveRecord::Migration
]
def up
namespace_table = Arel::Table.new('namespaces')
users_table = Arel::Table.new('users')
matching_path = namespace_table.project(namespace_table[:path])
.join(users_table).on(users_table[:id].eq(namespace_table[:owner_id]))
.where(users_table[:username].not_eq(namespace_table[:path]))
path_name = Arel::Nodes::SqlLiteral.new("matching_path.path FROM (#{matching_path.to_sql}) as matching_path")
update_column_in_batches(:users, :username, path_name) do |table, query|
query.where(table[:username].matches_any(DISALLOWED_ROOT_PATHS))
DISALLOWED_ROOT_PATHS.each do |path|
update_sql = "UPDATE users SET username = namespaces.path "\
"FROM namespaces WHERE namespaces.owner_id = users.id "\
"AND namespaces.type IS NULL "\
"AND users.username ILIKE '#{path}'"
connection.execute(update_sql)
end
end

View file

@ -2,8 +2,9 @@ require 'spec_helper'
require Rails.root.join('db', 'post_migrate', '20170518200835_rename_users_with_renamed_namespace.rb')
describe RenameUsersWithRenamedNamespace, truncate: true do
it 'renames a user that had his namespace renamed to the namespace path' do
it 'renames a user that had their namespace renamed to the namespace path' do
other_user = create(:user, username: 'kodingu')
other_user1 = create(:user, username: 'api0')
user = create(:user, username: "Users0")
user.update_attribute(:username, 'Users')
@ -14,6 +15,8 @@ describe RenameUsersWithRenamedNamespace, truncate: true do
expect(user.reload.username).to eq('Users0')
expect(user1.reload.username).to eq('import0')
expect(other_user.reload.username).to eq('kodingu')
expect(other_user1.reload.username).to eq('api0')
end
end