Ruby唯一的用户名生成器

时间:2020-09-14 22:31:04

标签: ruby-on-rails ruby

我正在实现OAuth。

用户模型需要用户名。 用户名必须由唯一的(uniqueness: true)组成。没有用户名或重复用户名就无法创建用户。

当用户注册OAuth时,我想为该用户生成一个唯一的用户名并将其保存。然后,给他们一个改变的机会。

为用户生成unique用户名的最佳方法是什么?

我可以使用类似Faker的方法来生成实际的名称。但是,它必须是唯一的。没有重复的用户名。如果Faker碰巧产生了骗子,则不会保存用户。

一种可能的实现是生成一个名称,然后尝试保存,如果由于名称冲突而失败,请重试。如果再次失败,请再次尝试。但我想知道是否有更好的方法?

4 个答案:

答案 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)

我可以通过以下方式解决此问题:

  • 生成唯一的字符串,其发生碰撞的可能性很小(SecureRandom)
  • 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