Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 根据给定的名称和+;1个计数器(如果用户名已存在)_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 根据给定的名称和+;1个计数器(如果用户名已存在)

Ruby on rails 根据给定的名称和+;1个计数器(如果用户名已存在),ruby-on-rails,ruby,Ruby On Rails,Ruby,我尝试根据给定的名称构造用户名。因为很多人都叫“John”,所以我需要以某种方式检查它,并按照+1计数创建它 我对如何迭代ActiveRecord以在本例中查找名为john的用户名有点迷茫,如果已经存在,请尝试john1,如果不可用,请尝试john2,以此类推。我可以假设它将使用而但是我不知道如何在这种情况下迭代它 知道怎么做吗?为了避免多次访问数据库,请获取与名称匹配的用户列表,检查用户数,将计数附加到名称,然后检查已加载的集合中的新名称 它看起来像这样: name = params[:nam

我尝试根据给定的名称构造用户名。因为很多人都叫“John”,所以我需要以某种方式检查它,并按照+1计数创建它

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


知道怎么做吗?

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

它看起来像这样:

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
上调用
以_a
,因此不必担心意外地向数据库发送多个查询,因为它正在转换为标准的Ruby数组。

Mmm。出于某种原因,即使数据库中已经有一个“john1”,第二行查询也只返回一个对象“John”。必须添加百分号才能执行通配符。例如:
name=“#{params[:name]}%”
。这将返回一个类似于
“John%3”
的对象。如果我运行一个
name.gsub('%','')
我会得到一个
“John”
。结果应该是在这种情况下,
John3
。呵呵,是的,很抱歉。看看我的编辑。只需将
%
附加到
名称
的位置移动到查询本身。此代码有一个陷阱:如果未使用
John
,它将返回
John0
。它应该返回
John