带设计的Rails:从名字设置唯一的用户名

时间:2016-09-03 00:50:46

标签: ruby-on-rails-3 devise

在我的应用中,我尝试自动填充username字段中的first_name列,该字段已绑定到我的Devise登录系统。从理论上讲,它应该只是user' first_name如果他们是唯一一个有这个名字的人,但它应该是像#34; 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但是,如果有更好的或更多的Ruby&#34;请告诉我。办法。任何有助于此工作的帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

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

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

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
  

注意:如果您的应用程序扩展并且拥有大量用户,那么使用这样的用户名会产生性能问题。