2009-07-10 76 views
0

我定期使用某個哈希標籤獲取最新的推文並將其保存在本地。爲了防止保存重複,我使用下面的方法。不幸的是,它似乎並沒有工作...所以什麼是錯,此代碼:保存前刪除數組中的重複項

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獲取。我會很感激任何解決方案的作品,尤其是一個可能更優雅...

回答

2

你可以在Tweet模型validate_uniqueness_of :twitter_id(這裏代碼應該是)。這會導致重複失敗保存。

+0

validate_uniqueness_of:twitter_id這不是一個好的解決方案。在檢查記錄的存在並創建新記錄之間,其他進程可能會創建重複記錄。您應始終將此方法與數據庫索引結合使用。 – 2009-07-10 19:24:59

+0

@weppos:由於我只有一個順序工作寫推文,這不是問題。這似乎是最「幹」的解決方案。在sqlite3上工作得很好,但在生產模式/ mysql下,它似乎沒有注意到重複...現在正在查看它。 – effkay 2009-07-10 20:15:50

0

array.uniq!

刪除自我的重複元素。如果沒有更改,則返回nil(即沒有找到重複項)。

1

由於聽起來您正在使用Twitter搜索API,更好的解決方案是使用since_id參數。跟蹤您從上一個查詢中獲取的最後一個推特狀態ID,並將其作爲您下一個查詢的since_id參數。

更多信息,請Twitter Search API Method: search

0

好了,原來的問題是有點不同的性質:當仔細一看進去,我發現multipe推文被保存在twitter_id 2147483647 ...這是整數字段的上限:)

將字段更改爲bigint解決了該問題。我花了很長時間才弄清楚,因爲MySQL默默地失敗了,只要它能夠恢復到最大值。 (直到我添加了唯一索引)。我很快用postgres試了一下,後者返回了一個很好的「Integer超出範圍」的錯誤,然後在這裏指出了問題的真正原因。

感謝Ben的驗證和索引技巧,因爲他們現在導致更清潔的代碼!