3

У меня есть приложение для рельсов, в котором я использую самородки и драгоценности из паранойи.
У меня есть таблица users в postgres db, которая имеет уникальную проверку в столбце электронной почты. Я использую паранойю для мягкого удаления, проблема заключается в том, когда я удаляю пользователя, а затем tey, чтобы создать пользователя, используя электронную почту удаленного пользователя, он выдает ошибку PG::UniqueViolation: ERROR.
Я прочитал об этом и знаю, что это можно решить, используя функцию частичного индекса рельсов.Уникальная проблема ограничения paranoia gem

http://scottsmerchek.com/2015/08/03/taking-the-d-out-of-crud/

https://devcenter.heroku.com/articles/postgresql-indexes#partial-indexes

Как я это реализовать?
Извините за плохое форматирование, набрав с мобильного.

ответ

2

Поскольку вы удалили пользователя как «мягкое» удаление, чтобы электронная почта не удалялась из базы данных, только для атрибута пользователя is_deleted было установлено значение true.

Для решения PG::UniqueViolation: ERROR теперь вы должны создать уникальный индекс на обоих местах электронной почты и deleted_at Так что ваша миграция будет

class AddUniqueIndexToUsers < ActiveRecord::Migration 
    def change 
    remove_index :users, column: :email 
    add_index :users, [:email, :deleted_at], unique: true 
    end 
end 
+0

Я использую Postgres, который поддерживает частичные индексы, 'CREATE UNIQUE INDEX customer_name_index на клиенте (имя) WHERE deleted_on IS NULL; '. Как мне получить что-то вроде этого? Что будет с миграцией? @Rakesh –

+0

Вы попробовали решение? –

+0

Не могли бы вы объяснить, почему вы делали remove_index перед add_index? Индекс добавлен по умолчанию? @RakeshPatidar –

 Смежные вопросы

  • Нет связанных вопросов^_^