Вы можете создать красивое читаемое имя пользователя (например, сгенерированное из первой части письма), а затем убедиться, что оно уникально, добавляя числа до тех пор, пока оно не станет.Например,
#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}"
num += 1
end
new_login
end
Одна из проблем здесь заключается в том, что кто-то потенциально может поместить этот логин между вами, когда вы получите его, и вы сохраните его.Так что, может быть, лучше объединить его в фильтр before_create:
#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}"
num += 1
end
self.login = new_login
end
end