Удаление повторяющихся записей на основе нескольких столбцов

В нашей системе мы запускаем ежечасный импорт из внешней базы данных. Из-за ошибки в сценариях импорта теперь есть несколько повторяющихся записей.

Дубликат считается, где любая запись имеет те же :legacy_id и :company.

Какой код можно запустить для поиска и удаления этих дубликатов?

Я играл с этим:

Product.select(:legacy_id,:company).group(:legacy_id,:company).having("count(*) > 1")

Казалось, что он возвратил некоторые из дубликатов, но я не был уверен, как удалить оттуда?

Любые идеи?

Ответы

Ответ 1

Вы можете попробовать следующий подход:

Product.group_by { |x| [x.legacy_id, x.company] }
       .flat_map { |_,x| x.drop(1) }
       .delete_all

Или чистый ActiveRecord:

Product.where.not(id: Product.group(:legacy_id, :company).pluck('min(products.id)'))
       .delete_all

Или чистый sql:

delete from products
where id not in ( 
   select min(p.id) from products p group by p.legacy_id, p.company
)