特定の日付に複数のレコードがある場合、その日の最新のレコードを除くすべてのレコードを削除します。たとえば、IDが9、10、12のテーブルレコードは同じ日付です。したがって、ID12が最新の日付を持つレコードとして9と10を削除する必要があります。ここでActiveRecord:重複レコードを削除する
id date
1 2012-04-25 00:00:00.000000
2 2012-04-26 00:00:00.000000
3 2012-04-23 00:00:00.000000
4 2012-04-24 00:00:00.000000
5 2012-05-01 00:00:00.000000
6 2012-05-02 00:00:00.000000
7 2012-05-03 00:00:00.000000
8 2012-05-04 00:00:00.000000
9 2012-04-30 00:30:00.000000
10 2012-04-30 18:00:00.000000
11 2012-04-29 00:00:00.000000
12 2012-04-30 18:40:00.000000
13 2012-05-05 00:00:00.000000
14 2012-05-05 09:31:31.000000
重複を削除する(汚い)rakeタスク
task :remove_duplicate do
Rake::Task["remove_duplicate"].invoke
end
task :remove_duplicate => :environment do
weights = Weight.count(:group => "DATE(date)", :having => "COUNT(id) > 1")
weights_to_delete = []
weights.each do |weight|
start_date = weight[0].to_date.beginning_of_day
end_date = weight[0].to_date.end_of_day
day_weights = Weight.where("date >= ? and date <= ?", start_date, end_date).order(:date)
day_weights[0..-2].each do |weight|
weights_to_delete.push weight.id
end
end
Weight.delete(weights_to_delete)
end
私は、私が説明したようにレコードを削除することができていますが、私は私が取るアプローチに満足していないです。 ActiveRecord APIをより有効に活用して最新のものを保持して、特定の日付に重複したレコードを削除するよう指示してください。
おかげで、アミットパテル
が、私は1回限りの操作として使用されるとき、それは仕事をしたし、速度の前に明確に理解できるコードを読むことを好む。 – lime