Rails 3对唯一性的验证 - 逻辑

时间:2013-01-09 23:39:30

标签: ruby-on-rails-3

鉴于以下发票型号:

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),但需要重新创建。

你能帮我解决如何在po_number和invoice_number上验证唯一性的问题,这样即使相同的组合与不同的state_id一起被取消,也可以创建新记录吗?

2 个答案:

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

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