我会定期获取带有特定主题标签的最新推文并将其保存在本地。为了防止保存重复,我使用下面的方法。不幸的是,它似乎没有工作......所以这段代码出了什么问题:
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对象数组。我很感激任何有效的解决方案,特别是可能更优雅的解决方案...
答案 0 :(得分:2)
你可以在Tweet模型中validate_uniqueness_of :twitter_id
(此代码应该在哪里)。这将导致重复无法保存。
答案 1 :(得分:1)
由于听起来您正在使用Twitter搜索API,因此更好的解决方案是使用since_id
参数。跟踪您之前查询中获得的上一个Twitter状态ID,并将其用作下一个查询的since_id
参数。
答案 2 :(得分:0)
array.uniq!
从self中删除重复的元素。如果没有做出任何更改,则返回nil(即,没有找到重复项)。
答案 3 :(得分:0)
好的,事实证明这个问题有点不同:当仔细观察它时,我发现多重推文是用twitter_id 2147483647保存的......这是整数字段的上限:)
将字段更改为bigint解决了这个问题。我花了很长时间才弄清楚,因为MySQL确实无声地失败了,只要可能就恢复到最大值。 (直到我添加了唯一索引)。我很快用postgres尝试了它,它返回了一个很好的“整数超出范围”错误,然后指出了问题的真正原因。
感谢Ben提供的验证和索引提示,因为它们现在可以提供更清晰的代码!