我今天在RubyonRails项目中测试我的模型,它有两个独特的属性。
遗憾的是,should a matcher无法通过我的should validate_uniqueness_of
测试,因为它正在用这个属性执行保存操作,而另一个属性由于null值而无法保存。
这让我思考:
我应该删除对数据库中任何唯一列(特别是)的null检查,并仅依靠Rails的验证来防止这些列中的重复值吗
我使用的是Rails4。
谢谢!
否,至少如果您希望保证唯一性,则不会,因为validate_uniqueness_of
并不能真正确保其名称的含义。
这有几个原因。首先,某些ActiveRecord操作,如update_column
、toggle
等,将绕过验证。其次,validates_uniqueness_of
不是线程安全的,因此如果在不同的事务中同时提交到数据库,那么两个具有相同值的保存事件可以创建记录。
此外,validates_uniqueness_of
将运行一个SELECT
语句来检查该值是否已经存在,这会给保存模型所需的时间增加少量开销。