目前正在尝试生成特定范围内的随机数; 并确保它对其他存储的记录是唯一的。
使用Mysql。可能像一个id,递增;但不可能。
目前以“昂贵”的方式测试其他现有记录; 但我很确定会使用干净的1/2行代码
目前正在使用:
test = 0
Order.all.each do |ord|
test = (0..899999).to_a.sample.to_s.rjust(6, '0')
if Order.find_by_number(test).nil? then
break
end
end
return test
感谢您的帮助
答案 0 :(得分:2)
这是你的一线解决方案。自从调用.pluck
以从Order表中检索数字以来,它也更快。 .select
为每条记录实例化一个“Order”对象(这是非常昂贵且不必要的),而.pluck
则没有。它还避免使用.map
再次迭代每个对象以获取“数字”字段。如果我们在这种情况下使用.map
转换为数据库中的数值,我们也可以避免第二个CAST
。
(Array(0...899999) - Order.pluck("CAST('number' AS UNSIGNED)")).sample.to_s.rjust(6, '0')
答案 1 :(得分:1)
我认为,您可以执行以下操作:
def uniq_num_add(arr)
loop do
rndm = rand(1..15) # I took this range as an example
# random number will be added to the array, when the number will
# not be present
break arr<< "%02d" % rndm unless arr.include?(rndm)
end
end
array = []
3.times do
uniq_num_add(array)
end
array # => ["02", "15", "04"]
答案 2 :(得分:1)
我会做这样的事情:
# gets all existing IDs
existing_ids = Order.all.select(:number).map(&:number).map(&:to_i)
# removes them from the acceptable range
available_numbers = (0..899999).to_a - existing_ids
# choose one (which is not in the DB)
available_numbers.sample.to_s.rjust(6, '0')