删除“重复对象”

时间:2010-05-07 16:14:41

标签: ruby-on-rails ruby arrays activerecord

假设我有一个来自同一个类的对象数组,这里有两个值得关注的属性:name和created_at。

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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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
)