Rails 5 ActiveRecord删除重复项

use*_*045 5 activerecord ruby-on-rails

我有一个Rails 5应用程序.我有一个表格,里面填写了从各种来源提取的URL数据:

id     url
1      http://google.com
2      http://yahoo.com
3      http://msn.com
4      http://google.com
5      http://yahoo.com
6      http://askjeeves.com
Run Code Online (Sandbox Code Playgroud)

如何从此表中删除重复项?

dns*_*nsh 8

无循环的SQL解决方案:

Model.where.not(id: Model.group(:url).select("min(id)")).destroy_all
Run Code Online (Sandbox Code Playgroud)

要么

Model.where.not(id: Model.group(:url).select("min(id)")).delete_all
Run Code Online (Sandbox Code Playgroud)

要么

dup_ids = Model.group(:url).select("min(id)").collect{|m| m['min(id)']}
Model.where.not(id: dup_ids).delete_all
#Model.where.not(id: dup_ids).destroy_all 
Run Code Online (Sandbox Code Playgroud)

这将删除所有重复项,保留具有重复记录的最小ID的记录.


ide*_*dej 6

您可以按 url 分组,保留一个并删除重复项:

Model.all.group(:url).values.each do |dup|
  dup.pop #leave one
  dup.each(&:destroy) #destroy other
end
Run Code Online (Sandbox Code Playgroud)


kon*_*yak 5

获取良好 ID 的数组,然后删除不在该列表中的所有记录。

good_ids = Model.group(:url).pluck("max(id)")
Model.where.not(id: good_ids).delete_all
Run Code Online (Sandbox Code Playgroud)