0

给定

class Account < ActiveRecord::Base
  has_many :orders
end

我需要为每个帐户生成唯一的订单号。每个帐户可以有订单 1000 但订单 1000 不能存在于同一帐户中。

@account1 = Account.first
@account1.orders.create(:price => 1.20) # order 1000 auto generated, next will be 1001

account1 则不能有两个编号为 1000 的订单,但其他帐户可以。

我正在努力寻找实现这一点的最佳方法。

4

2 回答 2

1

我会添加验证,例如将以下内容添加到您的订单模型中:

validates :order_no, :uniqueness => { :scope => :account, :message => "Try again saving, a deadlock might have occurred!"}

为了确保,ID 实际上是唯一的并且没有发生死锁。然后添加以下验证:

before_validation :generate_and_set_uniq_order_no

def generate_and_set_uniq_order_no
  # insert Amit's solution here, or anything else (e.g. sorting/unifying/incrementing)
end

真正获得唯一的 id。

于 2012-09-17T08:05:16.540 回答
1

使用表排序,其中一个表将保存每个帐户的最后一个 ID。你的桌子的结构想要

ACCOUNT_ID  CURRENT_ID
3283    1000
5078    1000
9000       1

每次创建订单增量时,将其用作订单 ID 并更新帐户的 CURRENT_ID。

请注意,此解决方案的问题是并发和死锁

于 2012-09-17T07:14:11.990 回答