【发布时间】:2011-02-16 21:57:08
【问题描述】:
假设我有一个来自同一类的对象数组,这里有两个关注的属性:name 和 created_at。
如何在数组中找到同名的对象(视为dups),然后删除数据库中的重复记录。但是,created_at 日期最近的对象是必须删除的对象。
【问题讨论】:
标签: ruby-on-rails ruby arrays activerecord
假设我有一个来自同一类的对象数组,这里有两个关注的属性:name 和 created_at。
如何在数组中找到同名的对象(视为dups),然后删除数据库中的重复记录。但是,created_at 日期最近的对象是必须删除的对象。
【问题讨论】:
标签: ruby-on-rails ruby arrays activerecord
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
应该满怀希望地完成这项工作。
【讨论】:
seen = Set.new。这样include? 是 O(1) 而不是 O(n)。
如果这只是在表上引入 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
)
【讨论】: