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,也可以创建新记录,如果它被取消?

根据您的描述,我认为将: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

我认为您需要一个自定义验证器。像这样的代码可能会起作用:

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

相关内容

  • 没有找到相关文章