给出
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的订单,但其他帐户可以。
我正在努力实现这一目标的最佳方式。
答案 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。