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上添加条件唯一索引