生成范围模型ID

时间:2012-09-17 03:05:43

标签: ruby-on-rails ruby-on-rails-3

给出

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的订单,但其他帐户可以。

我正在努力实现这一目标的最佳方式。

2 个答案:

答案 0 :(得分:1)

使用Table Sequencing表格将为每个帐户保留最后一个ID。你的表的结构就像

ACCOUNT_ID  CURRENT_ID
3283    1000
5078    1000
9000       1

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

请注意,此解决方案的问题是Concurrency and Deadlock

答案 1 :(得分: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

真正获得uniq id。