2011-12-24 83 views
3

唯一性验证我对车型之一下面的验证规则,轨道上更新

validates :reciept_num, :presence => true, 
         :numericality => { :only_integer => true }, 
         :uniqueness => true, 
         :on => :update, 
         :if => "!status_id.nil?"` 

现在,当我更新使用update_attributes方法的对象它给了我下面的错误

reciept_num: has already been taken

更新对象时,我没有更改reciept_num属性?那么,为什么验证在更新时失败?

如果我没有更新值,它必须是旧的,因此应该通过验证。我错过了什么。

回答

5

首先,验证不会基于属性是否已更改而运行(除非您明确要求)。每次有唯一性验证的记录保存并且验证可以运行(如:on,:if,选项所定义),它将检查是否有除本身以外的任何实例与假定为唯一的值。

由于您对验证有条件,我想您最终可能会创建两个具有相同收货编号的实例,但这两个实例的空值为status_id。将status_id列和验证启动设置为操作并查找其他实例。

另一件事是,因为您的验证是在更新只有你可以创建多个实例具有相同的收货数量,再次尝试更新记录将触发验证。

我只是在猜测精确的场景。

+0

感谢您的回复。读完这个后,我想到我创建的种子数据有重复的条目。 – robert 2011-12-24 03:40:00

+1

而且,即使没有条件,':uniqueness => true'实际上也不能保证唯一性,所以在数据库中需要一个唯一的约束。 – 2011-12-24 03:40:26

+0

亩太矮了,你能详细点吗? – maletor 2012-09-07 07:20:53