Dedupe a model

Posted . Visible to the public.
def self.get_duplicates(*columns)
    self.order('created_at ASC').select("#{columns.join(',')}, COUNT(*)").group(columns).having("COUNT(*) > 1")
end

def self.dedupe(*columns)
    self.group_by{ |x| columns.map{ |col| x.send(col) } }.each do |duplicates|
      first_one = duplicates.shift
      
      # This will delete all duplicates except one
      duplicates.each{|x| x.destroy}
    end
end
columns = [:name, :description]
Model.get_duplicates(*columns).dedupe(*columns)
hashharvest
Last edit
hashharvest
Posted by hashharvest to Rails CheatSheets (2018-01-02 15:14)