2010-05-07 244 views
0

比方说,我有对象的同一类的数组,关切的两个属性在这里:名称和created_at。删除“重复对象”

如何找到数组中的同名(DUP的考虑)的对象,然后删除数据库中的重复记录。但是,具有最新的created_at日期的对象是必须删除的对象。

回答

2
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 

应该有希望完成这项工作。

+0

有语法错误,在这里,但我得到它的工作。谢谢! – keruilin 2010-05-07 17:10:49

+0

哦,对不起,错过了那个,现在应该修好。 – 2010-05-07 17:30:08

+0

做'seen = Set.new'会更好。那样'include?'是O(1)而不是O(n)。 – 2012-09-15 17:31:15

0

如果这仅仅是在桌子上引入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 
)