【问题标题】:Removing "duplicate objects"删除“重复对象”
【发布时间】:2011-02-16 21:57:08
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby arrays activerecord


    【解决方案1】:
    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)。
    【解决方案2】:

    如果这只是在表上引入 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
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 2013-12-24
      • 2017-01-13
      • 2015-10-04
      相关资源
      最近更新 更多