给定以下发票模型:
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