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の2つの注文を持つことはできませんが、他のアカウントは持つことができます。

私はこれを実装するための最良の方法に苦労しています。

4

2 に答える 2

1

テーブルが各アカウントの最後のIDを保持するテーブルシーケンスを使用します。あなたのテーブルの構造は

ACCOUNT_ID  CURRENT_ID
3283    1000
5078    1000
9000       1

注文増分を作成するたびに、それを注文IDとして使用し、アカウントのCURRENT_IDを更新します。

このソリューションの問題は同時実行性とデッドロックであることに注意してください

于 2012-09-17T07:14:11.990 に答える
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 に答える