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