Ruby on rails 生成要使用的订单号而不是ID

Ruby on rails 生成要使用的订单号而不是ID,ruby-on-rails,ruby,Ruby On Rails,Ruby,我想在more Orders表中为订单号创建一列 我想知道创建这个数字的最佳过程是什么 我在订单模型中创建了以下代码: before_validation :generate_order_number, on: :create def generate_order_number begin self.order_number = SecureRandom.random_number(10*10000) end while self.class.find_by(ord

我想在more Orders表中为订单号创建一列

我想知道创建这个数字的最佳过程是什么

我在订单模型中创建了以下代码:

before_validation :generate_order_number, on: :create

def generate_order_number
    begin
      self.order_number = SecureRandom.random_number(10*10000)
    end while self.class.find_by(order_number: order_number)
  end
这很可能很好,但我想知道是否有更好/更有效的方法

按照代码的方式,它总是至少是一个5位随机数或6位随机数

由于挑剔,我想把它设置为n位数

为了澄清,必须验证订单号的唯一性

更新:

工作代码现在是:

begin
      self.order_number = 5.times.map { [*0..9].sample }.join.to_i
    end while self.class.find_by(order_number: order_number)
end 
按照代码的方式,它总是至少是一个5位随机数或6位随机数

完全错了

1_000_000.
  times.
  map { SecureRandom.random_number(10*10000).to_s.length }.
  uniq
#⇒ [5, 4, 2, 3, 1]
SecureRandom.random_number不会生成范围为0..arg的数字。你看到的大多数是5位数,因为概率更高

我会选择一种更简单的方法

def generate_order_number
  order_number = 5.times.map { [*0..9].sample }.join.to_i
  self.class.find_by(order_number: order_number) ? 
    generate_order_number : order_number
end
注意!我建议从零开始将其设置为9+位数:在订单数量达到100万时,命中现有订单的可能性更小,对未来的支持也更好:

如果订单号是模型的一个实际属性,我们应该在其前面加上一个明确的接收者自身:


它工作,但不进入我的数据库。这是离题的,但为什么不呢?当我使用或验证:订单号、状态:true验证:订单号、唯一性:true。。订单无法保存。当我不使用它们时,订单会保存,但订单号不会保存到数据库中。注意,它在我的控制器中被列为白名单。当然,它是有效的。我不张贴不工作的答案。DB问题主要类似于,因为若订单号是您的实际模型属性,那个么您必须将self作为赋值的前缀。这是因为没有明确的接受者就不能呼叫二传,互联网上充满了关于它的信息。我会更新答案。哈哈,我知道,但现在数据库是一个问题。但我明白了。。。使用了以下begin self.order\u number=5.times.map{[*0..9].sample}.join.to\u i end while self.class.find\u byorder\u number:order\u number。。。与我的旧代码相同,但我采用了您的随机方法。。。谢谢
def generate_order_number
  self.order_number = 5.times.map { [*0..9].sample }.join.to_i
  self.class.find_by(order_number: order_number) ? 
    generate_order_number : self.order_number
end