说我有一个模特
class Post < ActiveRecord::Base
validates_uniqueness_of :title, :unless => Proc.new {|p| p.deleted?}
end
约束是我可以只有一个帖子有“foobar”作为标题而它没有被删除,1个帖子都被删除为真,也有“foobar”作为他们的标题。由于ActiveRecord无法保证this link标题的唯一性,我试图在列帖子上添加一个唯一索引,在列[:title,:deleted]上,当我尝试时,它会失败。将新删除的帖子插入数据库。
答案 0 :(得分:2)
在postgresql中可能
add_index :table_name, :columns, unique: true, where: "(deleted_at IS NULL)"
答案 1 :(得分:0)
大多数数据库都不可能有条件数据库索引,例如MySQL的。
如果您绝对必须保证唯一性,那么最好的选择可能是单独删除帖子表。您在主表上有唯一索引,但在包含已删除记录的表上没有。您最终会得到一个较小的帖子表和更简单的编码 - 不再需要在任何查询中过滤掉已删除的帖子。
您是否考虑过如果您取消删除帖子会发生什么? - 两个帖子可以有相同的标题吗?
其他一些选择是: