validation有条件时,数据库中的唯一性validation

当有多个进程时,在Rails中使用唯一性validation是不安全的,除非在数据库上也强制执行约束(在我的情况下是PostgreSQL数据库,所以请参阅http://robots.thoughtbot.com/the-perils-of-uniqueness-validations )。

在我的例子中,唯一性validation是有条件的:只有当模型中的另一个属性变为真时才应强制执行。 所以我有

class Model < ActiveRecord::Base validates_uniqueness_of :text, if: :is_published? def is_published? self.is_published end end 

因此模型有两个属性: is_published (布尔值)和text (文本属性)。 对于Model iff is_published为true的所有模型, text应该是唯一的。

使用http://robots.thoughtbot.com/the-perils-of-uniqueness-validations中建议的唯一索引太过限制,因为无论is_published的值如何,它都会强制执行约束。

是否有人知道PostgreSQL数据库中的“条件”索引? 还是另一种解决方法?

是的,使用部分UNIQUE索引 。

 CREATE UNIQUE INDEX tbl_txt_is_published_idx ON tbl (text) WHERE is_published; 

例:
如何在PostgreSQL上添加条件唯一索引