【问题标题】:how to add index conditionally如何有条件地添加索引
【发布时间】:2011-06-12 12:07:20
【问题描述】:

说我有模特

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

限制是我只能有 1 篇以“foobar”为标题的帖子,而它没有被删除,以及 1 篇以上的帖子,这些帖子都已被删除,它们的标题也为“foobar”。由于 ActiveRecord 不能保证来自 this link 的标题的唯一性,我正在尝试在 [:title, :deleted] 列上为表帖子添加唯一索引,当我尝试插入一个新删除的帖子到数据库。

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    在 postgresql 中是可能的

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

    【讨论】:

      【解决方案2】:

      大多数数据库都不可能有条件数据库索引,例如mysql。

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

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

      其他一些选项是:

      1. 删除帖子时更改标题,例如添加时间戳。
      2. 如果您可以找到 2 个或更多相同标题的实例,则在保存模型后引发异常。
      3. 保存前锁定整个表(悲观锁定)。
      4. 只希望它有效(您要多久让两个人在完全相同的时间发布相同的标题?)

      【讨论】:

      • 10年后还是这样吗?
      猜你喜欢
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      相关资源
      最近更新 更多