如何解决如何有条件地添加索引
| 说我有模特class Post < ActiveRecord::Base
validates_uniqueness_of :title,:unless => Proc.new {|p| p.deleted?}
end
约束是我只能有1个帖子以“ foobar”作为标题,而没有被删除,以及1个以上帖子,它们都被删除为真,并且也带有“ foobar”作为标题。由于ActiveRecord无法保证此链接中标题的唯一性,因此我试图在表帖子的[:title,:deleted]列上添加唯一索引,当我尝试插入新删除的帖子到数据库。
解决方法
在PostgreSQL中是可能的
add_index :table_name,:columns,unique: true,where: \"(deleted_at IS NULL)\"
, 大多数数据库(例如,数据库)不可能有条件数据库索引MySQL的。
如果您绝对必须保证唯一性,那么最好的选择可能是拥有一个单独的已删除帖子表。您在主表上具有唯一索引,但是在包含已删除记录的表上没有唯一索引。您最终将获得一个较小的帖子表和更简单的编码-不再需要在任何查询中过滤掉已删除的帖子。
您是否考虑过如果取消删除帖子会发生什么情况,那么两个帖子可以具有相同的标题吗?
其他一些选项是:
删除帖子时更改标题,例如添加时间戳。
如果您可以找到两个或更多具有相同标题的实例,则在保存模型后引发异常。
保存之前锁定整个表(悲观锁定)。
只是希望它能起作用(您要让两个人在同一时间发布同一标题的频率是多少?)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。