Rails with Devise:根据名字设置唯一的用户名

Rails with Devise: Set Unique Username from First Name

在我的应用程序中,我试图自动填充 first_name 字段中的 username 列,我已经绑定到我的 Devise 登录系统。理论上,如果只有 userfirst_name 有这个名字,它应该只是 first_name,但如果有的话,它应该是 "Mal the 4th" 或 "Jayne the 3rd"其他 users 已经有了这个名字。

到目前为止,在谷歌搜索和咨询其他 SO 帖子(比如 this 一个)时,我的 registrations_controller:

中有这个基本结构
  before_create :set_username

  private
  def set_username
    @users = User.where(first_name == self.first_name)
    same_first_name_array = []
    @users.each do |u|
      same_first_name_array << u.first_name
    end

    if same_first_name_array.size = 0
      self.username = first_name
    else
      self.username = first_name + " the " + ordinalize(same_first_name_array.size + 1)
    end
  end

但我正在努力填补空白。到目前为止,看起来最好的方法是做一个 if 语句来检查 first_name 是否是唯一的,如果不是 ordinalize 某种 count,但是请如果有更好的或 "more Ruby" 方法,请告诉我。任何帮助让它工作的人都将不胜感激!

我认为你的方法是正确的,但是肯定可以优化,你可以避免创建数组并填充所有相同名称的步骤。

此外,尝试查看是否可以在名字列上创建索引,这将优化查询。

self.username 已经指向用户输入的名称,只有当它多次出现时才需要更改它,所以不需要 if / else。仅在多次出现时更改它。

你可以像下面这样改写

    before_create :set_username

      private
      def set_username
        @users = User.where(first_name == self.first_name)
        self.username = @users.count.eql?(0) ? self.first_name : first_name + " the " + ordinalize(@users.count + 1)
      end

Note: having user names likes this will create performance issues when your application scales and has large number of users.