Ruby on rails 检查数组中条件的有效方法

Ruby on rails 检查数组中条件的有效方法,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有一个客户机模型,在下面的实例变量中,我收集所有标识符 @all_clients = Client.all.collect{|a| a.identifier} 这将返回[“client123”、“client234”、“client567”、“client789”] 此外,我有一个变量@create_id=“client123”,我正在通过执行@all_clients.include检查集合中是否存在@create_id的值@创建\u id 如果返回true,我将在其后面添加“\u 1”,如

我有一个客户机模型,在下面的实例变量中,我收集所有标识符

@all_clients = Client.all.collect{|a| a.identifier}
这将返回
[“client123”、“client234”、“client567”、“client789”]

此外,我有一个变量@create_id=“client123”,我正在通过执行
@all_clients.include检查集合中是否存在@create_id的值@创建\u id

如果返回true,我将在其后面添加“\u 1”,如下所示:
@create\u id您可以将AR查询限制为仅包括前缀与您的
@create\u id
匹配的记录

clients=Client.arel_table
matching_clients = Client.where( clients[:identifier].matches( "#{@create_id}%" ) )
如果
matching_clients
为空,则还没有具有该标识符前缀的客户端。否则 现在,您可以提取整数后缀片段,并确定下一个可用id是什么

last_suffix = matching_clients.
  map(&:identifier).
  map { |s| (s.split('_',2)[1] || 0).to_i }.
  max
如果标识符字段由索引支持,那么这应该是相当有效的

如果您的方案使用的后缀格式允许对后缀进行正确的词法排序(例如,始终将后缀填充到固定的宽度),那么您可以通过请求匹配的最大标识符将更多的工作推送到数据库及其索引中


请注意,如果您有多个可能要创建新的唯一标识符的并发进程,则整个方法都会受到竞争条件的影响。如果您的db架构在
clients.identifier
上有一个唯一索引(它也支持查询效率),那么当您尝试使用您创建的新标识符保存记录时,db将抛出唯一性约束错误,在这种情况下,您可以通过重新选择并派生新的候选标识符继续尝试,直到再次成功。

因此,只有当client123_1、client123_2、client123_3已经存在时,client123_4才会保存到集合中?否则,连续保存可能永远不会结束。是的,没错。只有当我发现带下划线的附加整数不存在时,我才保存@create_idthanking man,你搞定了。我有一些新的想法要继续。