2

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

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

知道怎么做吗?

4

1 回答 1

2

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

它看起来像这样:

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 数组。

于 2012-12-10T03:57:41.790 回答