0

次の請求書モデルがあるとします。

validates :po_number, :invoice_number, :invoice_date, :date_received, :state_id, :division_id, :pending_state_id, :approver_username, :approver_email, :presence => true
validates :po_number, :uniqueness => {:scope => :invoice_number}

請求書レコードがキャンセルされた (state_id = 4) 場合がありますが、再作成する必要があります。

キャンセルされた場合、同じ組み合わせが異なる state_id で存在する場合でも、新しいレコードを作成できるように、po_number と Invoice_number の一意性を引き続き検証する方法を教えてください。

4

2 に答える 2

0

あなたが説明したことに基づいて:state_id、スコープにを含め、 :unless(または:if) オプションを渡して、キャンセル (またはその他の状態) をチェックから除外するだけで十分だと思います。

validates :po_number, :uniqueness => {
  :scope => [:invoice_number, :state_id], 
  :unless => :cancelled? 
}

# assumes an instance method like
def cancelled?
  state_id == 4
end
于 2013-01-10T01:02:03.487 に答える
0

カスタムバリデーターが必要になると思います。このようなものがうまくいくかもしれません:

validate :unique_po_number
def unique_po_number
  errors.add(:po_number, 'must be unique') if self.class.where('state != 4').where(:po_number => po_number).count > 0
end
于 2013-01-09T23:56:27.023 に答える