How to find records that have duplicate data using Active Record

What is the best way to find records with duplicate values in a column using ruby and the new Activerecord?


Translating @TuteC into ActiveRecord:

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

Here's how I solved it with the AREL helpers, and no custom SQL:"COUNT(last_name) as total, last_name")
  .having("COUNT(last_name) > 1")
  .map{|p| {p.last_name =>} }

Really, it's just a nicer way to write the SQL. This finds all records that have duplicate last_name values, and tells you how many and what the last names are in a nice hash.

I was beating my head against this problem with a 2016 stack (Rails 4.2, Ruby 2.2), and got what I wanted with this:

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

With custom SQL, this finds types with same values for name:

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

In Rails 2.x, select is a private method of AR class. Just use find():

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

Here is a solution that extends the other answers to show how to find and iterate through the records grouped by the duplicate field:

duplicate_values =[:field]
Model.where(field: duplicate_values).group_by(&:field).each do |value, records|
  puts "The records with ids #{} have field set to #{value}"

It seems a shame this has to be done with two queries but this answer confirms this approach.

Need Your Help

Why is Apache seg faulting?

apache mod-rewrite segmentation-fault

We have a production server that seems to Seg Fault a few times every day. The fault is picked up by Apache and logged in the error log - but there seems to be no traffic around the time. If it's a