0
比方說,我有對象的同一類的數組,關切的兩個屬性在這裏:名稱和created_at。刪除「重複對象」
如何找到數組中的同名(DUP的考慮)的對象,然後刪除數據庫中的重複記錄。但是,具有最新的created_at日期的對象是必須刪除的對象。
比方說,我有對象的同一類的數組,關切的兩個屬性在這裏:名稱和created_at。刪除「重複對象」
如何找到數組中的同名(DUP的考慮)的對象,然後刪除數據庫中的重複記錄。但是,具有最新的created_at日期的對象是必須刪除的對象。
seen = []
#sort by created date and iterate
collection.sort({|a,b| a.created_at <=> b.created_at}).each do |obj|
if seen.map(&:name).include? obj.name #check if the name has been seen already
obj.destroy!
else
seen << obj #if not, add it to the seen array
end
end
應該有希望完成這項工作。
如果這僅僅是在桌子上引入UNIQUE INDEX前一次修正錯誤,你不妨做在SQL:
DELETE FROM t WHERE id IN (
SELECT t1.id
FROM t t1
LEFT JOIN t t2 ON t1.name = t2.name AND t2.created_at < t1.created_at
WHERE t2.id IS NOT NULL
)
有語法錯誤,在這裏,但我得到它的工作。謝謝! – keruilin 2010-05-07 17:10:49
哦,對不起,錯過了那個,現在應該修好。 – 2010-05-07 17:30:08
做'seen = Set.new'會更好。那樣'include?'是O(1)而不是O(n)。 – 2012-09-15 17:31:15