2009-07-10 9 views
0

定期的に最新のつぶやきを特定のハッシュタグで取り出し、ローカルに保存します。重複を避けるために、以下の方法を使用します。残念ながら、このコードで間違っているので、何...動作していないようです:@tweetsがさえずるの配列は、Twitterからフェッチオブジェクトである保存する前に配列から複製を削除する

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 

を。私は、特により洗練されたものと思われるソリューションをお試しいただければ幸いです。

答えて

2

validate_uniqueness_of :twitter_id(このコードはどこですか)これにより、複製が保存されなくなります。

+0

validate_uniqueness_of:twitter_idそれは良い解決策ではありません。レコードの存在をチェックしてから新しいレコードを作成するまでの間に、別のプロセスが複製を作成する可能性があります。このメソッドは、常にデータベースインデックスと組み合わせて使用​​する必要があります。 –

+0

@weppos:つづれているつもりのつぶやきしかないので、これは問題ではありません。これは、ほとんどの "DRY"ソリューションのようです。 sqlite3ではうまく動作しましたが、本番モード/ mysqlでは重複を気にするようには見えませんでした。 – effkay

+0

実際の安全のためには、データベースに一意性制約を設定し、スローされた例外を処理する準備が整うようにしてください。 –

0

array.uniq!

自己から重複要素を削除します。変更が加えられていない場合(すなわち重複が見つからない場合)はnilを返します。

+0

はデータベース内の重複には役立ちません。 –

1

Twitter検索APIを使用しているように聞こえるので、より良い解決策はsince_idパラメータを使用することです。前回のクエリから取得した最後のtwitterステータスIDを追跡し、次のクエリでsince_idパラメータとして使用します。

詳しい情報は、Twitter Search API Method: search

0

オクラホマで利用可能であるという問題点が異なる性質のビットだっ判明:近いそこに見たとき、私はmultipeツイートがtwitter_id 2147483647で保存されたことが判明...これがあります整数フィールドの上限:

フィールドをbigintに変更すると問題が解決しました。 MySQLは黙って失敗し、できるだけ最大値に戻ってしまったので、私は非常に時間がかかりました。 (ユニークなインデックスを追加するまで)。 postgresですばやく試してみました。これは "Integer out of range"というエラーが返されました。ここで問題の本当の原因を指摘しました。

ベンダーが検証とインデックス作成のヒントをお寄せいただき、ありがとうございました。

関連する問題