как удалить повторяющуюся строку при добавлении индексных рельсов

Поэтому я пытаюсь добавить индекс в свою таблицу голосов, чтобы предотвратить добавление повторяющихся строк.

В моем предыдущем вопросе о стеке. Я спросил: «Как мне убедиться, что повторяющиеся строки не добавляются в мою таблицу базы данных через активные записи?» Как убедиться, что повторяющиеся строки не добавляются в мою таблицу базы данных с помощью ActiveRecords?

Ответ заключался в добавлении индекса через миграцию базы данных, и это решило проблему.

class AddUniqueIndexToVotes < ActiveRecord::Migration
  def change
     add_index :votes,  [:voter_id, :votefor_id, :vote], unique: true
  end
end

Однако теперь я получаю сообщение об ошибке.

PG::Error: ERROR:  could not create unique index "index_votes_on_voter_id_and_votefor_id_and_vote"
DETAIL:  Key (voter_id, votefor_id, vote)=(581, 519, 2) is duplicated.

Как автоматически удалить повторяющиеся строки/строки при выполнении миграции.

спасибо!


person user3649729    schedule 18.05.2014    source источник


Ответы (2)


Вы можете сначала удалить повторяющиеся записи с помощью следующего оператора sql, предполагая, что у вас есть первичный ключ, состоящий из одного столбца. Кроме того, имейте в виду, что он удаляет все повторяющиеся записи, которые не имеют минимального значения для своего столбца id.

    DELETE FROM votes v WHERE v.id NOT IN 
    (SELECT MIN(id) FROM votes GROUP BY voter_id, votefor_id, vote)
person dominik    schedule 15.07.2016

запустить еще одну миграцию, перед которой будут уничтожены все «дубликаты» строк?

вы также хотите добавить в модель validates_uniqueness_of

http://apidock.com/rails/ActiveRecord/Validations/ClassMethods/validates_uniqueness_of

person Jakub Kuchar    schedule 18.05.2014