как добавить индекс условно - PullRequest
0 голосов
/ 12 июня 2011

скажи, у меня есть модель

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

Ограничение: у меня может быть только 1 сообщение с заголовком "foobar", в то время как оно не удалено, и 1+ сообщений, которые все были удалены, чтобы быть правдой, также с заголовком "foobar". Поскольку ActiveRecord не может гарантировать уникальность заголовка из этой ссылки , я пытаюсь добавить уникальный индекс в столбцы таблицы, для столбцов [: title,: Удалено], сценарий завершится неудачно, когда Я пытаюсь вставить новый удаленный пост в БД.

Ответы [ 2 ]

2 голосов
/ 05 марта 2018

Это возможно в postgresql

add_index :table_name, :columns, unique: true, where: "(deleted_at IS NULL)"
0 голосов
/ 12 июня 2011

Невозможно иметь условный индекс базы данных для большинства баз данных, например, MySQL.

Вероятно, лучшим вариантом, если вы абсолютно обязаны гарантировать уникальность, было бы наличие отдельной таблицы удаленных сообщений.У вас есть уникальный индекс в главной таблице, но не в таблице, содержащей удаленные записи.В итоге вы получили бы таблицу сообщений меньшего размера и более простое кодирование - больше нет необходимости отфильтровывать удаленные сообщения в каких-либо запросах.

Рассматривали ли вы, что должно произойти, если вы удалите сообщение - может два сообщения затем иметьтот же заголовок?

Некоторые другие параметры:

  1. Изменение заголовка при удалении сообщения, например, добавление метки времени.
  2. Вызов исключения после моделисохраняется, если вы можете найти 2 или более экземпляров одного и того же заголовка.
  3. Блокировка всей таблицы перед сохранением (пессимистическая блокировка).
  4. Просто надеюсь, что это сработает (как часто вы собираетесьдва человека публикуют один и тот же заголовок в одно и то же время?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...