0

有很多类似的问题,但找不到适合我的答案。

我有EntryVote带字段的模型user_identry_id还有一些其他的。

我想创建简单的 rake 任务来删除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')

4

2 回答 2

0

如果您希望列成为唯一entry_iduser_id外键,则以下包含特殊 SQL 删除语句的 rake 任务将有所帮助

  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或本文如何使用 SQL 删除重复项

于 2013-03-05T14:43:19.597 回答
0

可能不是最好的解决方案,但请尝试以下方法

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 的唯一性并尝试保存记录。如果记录未保存并且由于验证而失败,则只需删除该记录。我很确定这比第一个选项要慢:)

于 2013-03-05T12:36:09.710 回答