ruby-on-rails - 根据给定的名称和 +1 计数器构造用户名(如果用户名已存在)

标签 ruby-on-rails ruby

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

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

知道如何做到这一点吗?

最佳答案

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

它看起来像这样:

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

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

关于ruby-on-rails - 根据给定的名称和 +1 计数器构造用户名(如果用户名已存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13794250/

相关文章:

sql - ruby rails : Query where date equals another date (ignoring time)

Ruby 1.9.2 字符编码 : invalid multibyte character:/?/

ruby-on-rails - Where 子句按 "ANY"过滤 - 这是什么意思?

ruby-on-rails - Ruby Rails - mac 上的 gcc 问题

ruby-on-rails - 在 Ruby on Rails 应用程序的 Redis 上使用 hkeys 查找每个

ruby-on-rails - 设计 ensure_authentication_token 报告未定义的方法

ruby-on-rails - Redis + websocket-rails(将 Redis 用于不止一项服务)

ruby-on-rails - 使用 nokogiri 更新节点打开 xml 文件并保存

ruby - 如果值不在另一个哈希中,则从循环中的哈希中删除值

ruby-on-rails - rails.vim 和自定义 Controller 位置