Rails生成之前未使用过的唯一订单号

时间:2015-04-17 09:51:56

标签: ruby-on-rails ruby-on-rails-4

我正在尝试生成订单号,并希望确保不仅仅是为了安全性。

  1. 我想生成订单号
  2. 在使用之前检查订单号是否未使用
  3. 如果使用之前再次从1开始重复。
  4. 独特的生成器

    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
    

    当我尝试运行上述内容时,它会继续运行并且永不退出。数据库中也没有记录。

3 个答案:

答案 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不能重复。