首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有条件地添加索引

问如何有条件地添加索引
EN

Stack Overflow用户
提问于 2011-06-12 20:07:20
回答 2查看 3.1K关注 0票数 4

假设我有一个模型

代码语言:javascript
复制
class Post < ActiveRecord::Base
  validates_uniqueness_of :title, :unless => Proc.new {|p| p.deleted?}
end

限制是我只能有一个帖子的标题是"foobar“,而它没有被删除,而1+帖子也有"foobar”作为标题,它们都被删除了。因为ActiveRecord不能保证来自this link的标题的唯一性,所以我尝试为表posts添加一个唯一的索引,在columns : title,:deleted上,当我试图向数据库中插入一个新的已删除帖子时,它将失败。

EN

回答 2

Stack Overflow用户

发布于 2018-03-05 13:47:01

这在postgresql中是可能的

代码语言:javascript
复制
add_index :table_name, :columns, unique: true, where: "(deleted_at IS NULL)"
票数 18
EN

Stack Overflow用户

发布于 2011-06-12 21:03:58

对于大多数数据库,例如MySQL,不可能有条件数据库索引。

如果你绝对需要保证文章的唯一性,那么最好的选择可能就是创建一个单独的删除帖子表。您在主表上有唯一索引,但在包含已删除记录的表上没有唯一索引。你最终会得到一个更小的帖子表和更简单的代码-不再需要在任何查询中过滤掉删除的帖子。

你有没有考虑过如果你取消删除一个帖子会发生什么--两个帖子可以有相同的标题吗?

其他一些选项包括:

  1. 在删除帖子时更改标题,例如,在保存模型后添加timestamp.
  2. Raise如果可以找到相同标题的2个或更多实例,则会出现异常。
  3. 在保存之前锁定整个表(悲观锁定)。
  4. 只希望它有效(您打算让两个人同时发布相同标题的频率是多少?)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6321836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档