You can create a nice readable username (for example, generated from the first part of the letter), and then make sure that it is unique by adding numbers until they are gone. eg,
#in User def get_unique_login login_part = self.email.split("@").first new_login = login_part.dup num = 2 while(User.find_by_login(new_login).count > 0) new_login = "#{login_part}#{num}" end new_login end
One of the problems is that someone can potentially summarize this login between you, and you save it. So, perhaps the best thing is to combine it into a before_create filter:
#in User before_create :ensure_login_uniqueness def ensure_login_uniqueness if self.login.blank? || User.find_by_login(self.login).count > 0 login_part = self.email.split("@").first new_login = login_part.dup num = 2 while(User.find_by_login(new_login).count > 0) new_login = "#{login_part}#{num}" end self.login = new_login end end
source share