2011-06-12 102 views
0

说,我有一个模型如何添加索引有条件

class Post < ActiveRecord::Base 
    validates_uniqueness_of :title, :unless => Proc.new {|p| p.deleted?} 
end 

的约束是我只能有1个职位有“foobar的”为题,而它的不被删除,1+职位,这些都是有被删除是真实的,也有“foobar”作为他们的头衔。由于ActiveRecord不能保证从this link标题的唯一性,我试图添加一个唯一的索引到表格的帖子上,列[:title,:deleted],它会失败的场景,当我尝试插入一个新的删除发布到数据库。

回答

0

在大多数数据库中不可能有条件数据库索引,例如MySQL的。

如果您绝对必须保证唯一性,最好的选择可能是将已删除的帖子单独列出。主表上有唯一索引,但不包含已删除记录的表。您最终将得到一个较小的帖子表和更简单的编码 - 不再需要在任何查询中过滤掉已删除的帖子。

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

一些其他的选项有:

  1. 变化,当你删除帖子的标题,例如添加一个时间戳。
  2. 如果可以找到2个或更多相同标题的实例,则在保存模型后引发异常。
  3. 保存之前锁定整个表格(悲观锁定)。
  4. 只是希望它的工作原理(你多久将会有两个人张贴在准确的同一时间同一个标题?)
0

有可能在PostgreSQL的

add_index :table_name, :columns, unique: true, where: "(deleted_at IS NULL)"