2013-03-05 2 views
0

Существует много подобных вопросов, подобных этому, но я не мог найти для меня хороший ответ.Удаление дубликатов с заданием грабли

У меня есть EntryVote модель с полями user_id, entry_id и некоторые другие.

Я хочу создать простую задачу рейка, чтобы удалить дубликаты для user_id, entry_id групп (не имеет значения, какая запись оставлена ​​в группе). Каков наилучший способ сделать это?

Например:

id, user_id, entry_id 
1,1,1 
2,1,1 
3,1,1 
4,5,6 
5,5,6 
6,7,7 

я получаю:

1,1,1 
4,5,6 
6,7,7 

Я знаю, как выбрать user_id, entry_id для дедупликации, но не знаете, как работать с ним позже:

EntryVote.select('user_id, entry_id').group('user_id,entry_id').having('count() > 1')

+0

Для подтверждения, вы хотите удалить дубликат 'EntryVotes', где' user_id' и 'entry_id' совпадают? –

+0

нет, только что отредактировал вопрос с примером –

ответ

0

Возможно, это не лучшее решение, но попробуйте f ollowing

EntryVote.count(:id, group: [:user_id, :entry_id]).each do |(user_id, entry_id), count| 
    if count > 1 
    EntryVote.offset(1).where(user_id: user_id, entry_id: entry_id).delete_all 
    end 
end 

или вы можете добавить проверку, которая проверяет уникальность user_id и entry_id и попытаться сохранить запись. Если запись не сохраняется и не выполняется из-за проверки, просто удалите запись. Я уверен, что это медленнее, что первый вариант :)

0

Если вы хотите столбцы entry_id и user_id быть уникальным внешним ключом, следующая рейк задача, которая содержит специальный SQL удалить заявление поможет

task 'delete_duplicates' => :environment do 
    puts "Removing duplicates in table entry_votes" 
    puts "Entries before: #{n1=EntryVote.count}" 
    sql = "delete e1 from entry_votes e1, entry_votes e2 "+ 
      "where (e1.user_id = e2.user_id) and (e1.entry_id = e2.entry_id) "+ 
      "and (e1.id > 12.id);") 
    ActiveRecord::Base.connection.execute(sql); 
    puts "Entries after: #{n2=EntryVote.count}, #{n1-n2} duplicates removed" 
    end 

См. Также SO question about duplicates или эту статью how to delete duplicates using SQL.

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