我正在实现OAuth。
用户模型需要用户名。
用户名必须由唯一的(uniqueness: true
)组成。没有用户名或重复用户名就无法创建用户。
当用户注册OAuth时,我想为该用户生成一个唯一的用户名并将其保存。然后,给他们一个改变的机会。
为用户生成unique
用户名的最佳方法是什么?
我可以使用类似Faker
的方法来生成实际的名称。但是,它必须是唯一的。没有重复的用户名。如果Faker碰巧产生了骗子,则不会保存用户。
一种可能的实现是生成一个名称,然后尝试保存,如果由于名称冲突而失败,请重试。如果再次失败,请再次尝试。但我想知道是否有更好的方法?
答案 0 :(得分:2)
如果发生碰撞,请使用SecureRandom.rand(10000..99999)
之类的东西来调味,如下所示:
def find_unique(username)
test_username = username
while (User.where(username: test_username).any?)
test_username = "#{username}#{SecureRandom.rand(10000..99999)}"
end
test_username
end
假设您永远不会有100,000个名称完全相同的用户,那么最终会发现差距。如果您担心,可以随时将其增加到6、7或更多位数。
答案 1 :(得分:1)
我可以通过以下方式解决此问题:
username
字段上有一个索引before_create :generate_unique_username
def generate_unique_username
self.username = loop do
unique_string = "user-#{ SecureRandom.hex(8)}"
break unique_string unless User.where(username: unique_string).first
end
end
答案 2 :(得分:0)
我认为最好的方法是在用户模型中使用SecureToken
:
has_secure_token :username
https://api.rubyonrails.org/classes/ActiveRecord/SecureToken/ClassMethods.html
答案 3 :(得分:0)
有关信息,可以通过调用unique
方法来使用Faker生成唯一名称。
用户名示例:
Faker::Internet.unique.user_name