根据给定的名称和+1计数器构建用户名(如果用户名已存在)

时间:2012-12-10 02:39:11

标签: ruby-on-rails ruby

我尝试根据给定的名称构建用户名。由于许多人被命名为“约翰”,我需要以某种方式检查这一点并通过+1计数来创建它。

我在如何迭代ActiveRecord以找到一个名为john的用户名时有点迷失,然后如果已经存在,请尝试john1如果不可用,请尝试john2等等上。我可以假设它会使用while,但我不知道如何在这种情况下迭代它。

知道怎么做吗?

1 个答案:

答案 0 :(得分:2)

为了不多次访问数据库,获取与名称匹配的用户列表,检查用户数,将计数附加到名称,然后检查已加载的集合中是否有新名称。< / p>

它看起来像这样:

name = params[:name]
users = User.where(User.arel_table[:name].matches("#{params[:name]}%")).to_a
count = users.length

name_without_collision = if count > 0
  loop do
    break "#{name}#{count}" unless users.any? { |u| u.name == "#{name}#{count}" }
    count += 1
  end
else
  name
end

由于您在to_a上调用ActiveRecord::Relation,因此您不必担心会不时地向数据库发送多个查询,因为它正在转换为标准的Ruby数组。