這將破壞在波浪中重複,只選擇每map_id
單個重複,在每個通。當不存在更多重複時,循環將自動完成。
loop do
duplicates = Summary.select("MAX(id) as id, map_id").group(:map_id).having("count(*) > 1")
break if duplicates.length == 0
duplicates.destroy_all
end
如果數據庫是這樣的:
| id | map_id |
| 1 | 235 |
| 2 | 299 |
| 3 | 324 |
| 4 | 235 |
| 5 | 235 |
| 6 | 299 |
| 7 | 235 |
| 8 | 324 |
| 9 | 299 |
在第一波,這些記錄將被退回和銷燬:
| id | map_id |
| 7 | 235 |
| 8 | 324 |
| 9 | 299 |
第二波,這一紀錄將是返回並銷燬:
| id | map_id |
| 5 | 235 |
| 6 | 299 |
第三波將返回並銷燬此記錄:
| id | map_id |
| 4 | 235 |
第四次浪潮將完成該過程。除非給定的map_id
有許多重複項,否則很可能這個過程將以單數位循環迭代完成。
鑑於此方法,將只會複製重複項,並且只會刪除重複的重複項。要刪除年長重複,相反,查詢可以改變這一點:
duplicates = Summary.select("MIN(id) as id, map_id").group(:map_id).having("count(*) > 1")
在這種情況下,第1波將返回並摧毀:
| id | map_id |
| 1 | 235 |
| 2 | 299 |
| 3 | 324 |
2波將返回並摧毀:
| id | map_id |
| 4 | 235 |
| 6 | 299 |
3波將返回並摧毀:
| id | map_id |
| 5 | 235 |
Wave 4將完成該過程。
如果你知道你的SQL的方式,你爲什麼不只是在SQL呢? –
出於某種原因,我認爲在rails中使用純SQL很困難。我在SQL中做了幾次。一個是按照map_id排序,然後選擇第一個。其他的可能是order by,創建一個count列,然後選擇column count = some_number(如果你不想要第一個,而是第二個或第三個觀察被保留)。 – nonegiven72
在Rails中使用原始SQL很容易,我一直這麼做,因爲ActiveRecord只能理解嬰兒談話SQL。 –