我应该只依靠Ruby on Rails的验证机制来维护列的唯一性吗?

时间:2016-04-15 21:56:58

标签: ruby-on-rails

我正在测试我的模型,它在我的Ruby on Rails项目中有两个独特的属性。

可悲的是,shoulda matcher未通过我的should validate_uniqueness_of测试,因为它正在使用此属性执行保存操作,而另一个属性因null值而无法保存。

这让我思考:

我是否应该删除数据库中任何唯一列(特别是)的空检查,并且仅依靠Rails的验证来防止这些列中的重复值?

我正在使用Rails 4。

谢谢!

1 个答案:

答案 0 :(得分:0)

不,至少不是,如果您希望保证唯一性,因为validate_uniqueness_of并不能真正确保其名称所暗示的内容。

这有几个原因。首先,某些ActiveRecord操作(例如update_columntoggle等)将绕过验证。其次,validates_uniqueness_of不是线程安全的,因此如果它们同时提交到数据库,则在单独的事务中两个相同值的保存事件可以创建记录。

此外,validates_uniqueness_of将运行SELECT语句来检查该值是否已存在,这会为保存模型所花费的时间增加少量开销。