How to set up usernames from email of all users?

I would like to create rake task to set the username of all users’ without a username to the part before the ‘@’ in their email address. So if my email is test@email.eu, my username should become test. If it’s not available, prepend it by a number (1).

So i have problem witch checking uniqness of username. Code below isn`t working after second loop ex: when i have three emails: test@smt.com, test@smt.pl, test@oo.com username for test@oo.com will be empty.

I have of course uniqness validation for username in User model.

desc “Set username of all users wihout a username”

task set_username_of_all_users: :environment do

users_without_username = User.select{ |u| !u.username? }

users_without_username.each do |user|

username = user.email.split(’@’).first

if User.find_by_username(username).blank?

user.username = username

user.save

else

User.find_by_username(username).each_with_index do |u, index|

u.username = username.insert(0, index)

u.save

end

end

end

end

Other ideas are in Gist: https://gist.github.com/3067635#comments

If you have your validations set, you can use something like

in User model:
scope :without_username, where(:username => nil)
validates :username, :uniqueness => true, :presence => false

and then use
users = User.without_username

users.each do |user|
username = user.email.split(/@/).first
user.username = username
while !user.valid?
   user.username+=rand(10).to_s
end
user.save
end

tom

But what if I would like to have usernames with increasing prefix this “test”, “1test”, “2test”

W dniu poniedziałek, 9 lipca 2012 15:35:32 UTC+2 użytkownik tom meinlschmidt napisał:

then try something like (replace while)

users.each do |user|
username = user.email.split(/@/).first
prefix = 1
while !user.valid?
   user.username=prefix.to_s+username
   prefix+=1
end
user.save
end

tom