保存前从阵列中删除重复项

时间:2009-07-10 17:09:04

标签: ruby-on-rails ruby

我会定期获取带有特定主题标签的最新推文并将其保存在本地。为了防止保存重复,我使用下面的方法。不幸的是,它似乎没有工作......所以这段代码出了什么问题:

    def remove_duplicates
      before = @tweets.size
      @tweets.delete_if {|tweet| !((Tweet.all :conditions => { :twitter_id => tweet.twitter_id}).empty?) }
      duplicates = before - @tweets.size
      puts "#{duplicates} duplicates found"
    end

其中@tweets是从twitter获取的Tweet对象数组。我很感激任何有效的解决方案,特别是可能更优雅的解决方案...

4 个答案:

答案 0 :(得分:2)

你可以在Tweet模型中validate_uniqueness_of :twitter_id(此代码应该在哪里)。这将导致重复无法保存。

答案 1 :(得分:1)

由于听起来您正在使用Twitter搜索API,因此更好的解决方案是使用since_id参数。跟踪您之前查询中获得的上一个Twitter状态ID,并将其用作下一个查询的since_id参数。

有关详情,请访问Twitter Search API Method: search

答案 2 :(得分:0)

array.uniq!

从self中删除重复的元素。如果没有做出任何更改,则返回nil(即,没有找到重复项)。

答案 3 :(得分:0)

好的,事实证明这个问题有点不同:当仔细观察它时,我发现多重推文是用twitter_id 2147483647保存的......这是整数字段的上限:)

将字段更改为bigint解决了这个问题。我花了很长时间才弄清楚,因为MySQL确实无声地失败了,只要可能就恢复到最大值。 (直到我添加了唯一索引)。我很快用postgres尝试了它,它返回了一个很好的“整数超出范围”错误,然后指出了问题的真正原因。

感谢Ben提供的验证和索引提示,因为它们现在可以提供更清晰的代码!