如何使用Active Record查找具有重复数据的记录

使用ruby和新的Activerecord在列中查找具有重复值的记录的最佳方法是什么?

将@TuteC翻译成ActiveRecord:

sql = 'SELECT id, COUNT(id) as quantity FROM types GROUP BY name HAVING quantity > 1' #=> Type.select("id, count(id) as quantity") .group(:name) .having("quantity > 1") 

以下是我使用AREL帮助程序解决它的方法,而且没有自定义SQL:

 Person.select("COUNT(last_name) as total, last_name") .group(:last_name) .having("COUNT(last_name) > 1") .order(:last_name) .map{|p| {p.last_name => p.total} } 

真的,这只是编写SQL的一种更好的方法。 这将查找具有重复last_name值的所有记录,并告诉您在一个漂亮的哈希中有多少以及姓氏是多少。

我用2016年的堆栈(Rails 4.2,Ruby 2.2)击败了这个问题,并得到了我想要的东西:

 > Model.select([:thing]).group(:thing).having("count(thing) > 1").all.size => {"name1"=>5, "name2"=>4, "name3"=>3, "name4"=>2, "name5"=>2} 

使用自定义SQL,它会查找具有相同name值的types

 sql = 'SELECT id, COUNT(id) as quantity FROM types GROUP BY name HAVING quantity > 1' repeated = ActiveRecord::Base.connection.execute(sql) 

在Rails 2.x中,select是AR类的私有方法。 只需使用find():

 klass.find(:all, :select => "id, count(the_col) as num", :conditions => ["extra conditions here"], :group => 'the_col', :having => "num > 1") 

这是一个解决方案,扩展了其他答案,以显示如何查找和遍历由重复字段分组的记录:

 duplicate_values = Model.group(:field).having(Model.arel_table[:field].count.gt(1)).count.keys Model.where(field: duplicate_values).group_by(&:field).each do |value, records| puts "The records with ids #{records.map(&:id).to_sentence} have field set to #{value}" end 

遗憾的是,这必须通过两个查询完成,但这个答案证实了这种方法。