我正在尝试生成订单号,并希望确保不仅仅是为了安全性。
独特的生成器
def secure_token
DateTime.now.strftime("%Y/%m/").to_s + SecureRandom.hex(16/4).upcase
end
现在我想编写逻辑以检查是否未使用。
while Order.where.not(:order_no => secure_token) do
@order_no = secure_token
end
当我尝试运行上述内容时,它会继续运行并且永不退出。数据库中也没有记录。
答案 0 :(得分:2)
更好&正确的方法:
order_no = nil
loop do
order_no = secure_token
break unless Order.exists?(:order_no => order_no)
end
Order.new(:order_no => order_no, ....)
答案 1 :(得分:1)
这是因为Order.where
总是返回关系,即使它是空的,也是真实的。使用first
:
while Order.where.not(order_no: secure_token).first do
答案 2 :(得分:0)
您可以生成任何数字,并将订单数据库ID附加到其第一个/中间/结尾,无论您想要什么,都可以保证唯一性,因为您的订单数据库ID不能重复。