2009-07-10 10 views
0

정기적으로 특정 해시 태그로 최신 트윗을 가져 와서 로컬로 저장합니다. 중복을 방지하기 위해 아래 방법을 사용합니다. 불행하게도,이 코드를 잘못 그래서 뭐 ... 작동하지 않는 것 : @tweets이 트윗의 배열이 트위터에서 가져온 객체입니다저장하기 전에 배열에서 중복을 제거하십시오.

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

을 사용하려면 데이터베이스에 고유성 제약 조건을 넣고 throw 된 예외를 처리 할 준비가되어 –

0

array.uniq!

자기 자신에서 중복 요소를 제거합니다. 변경이 없으면 (즉, 중복이없는 경우) nil을 리턴합니다.

+0

은 데이터베이스에서 중복을 도울 수 없습니다. –

1

Twitter 검색 API를 사용하는 것처럼 들리므로 더 나은 해결책은 since_id 매개 변수를 사용하는 것입니다. 이전 쿼리에서 얻은 마지막 트위터 상태 ID를 추적하여 다음 쿼리에서 since_id 매개 변수로 사용하십시오.

상세 정보 Twitter Search API Method: search

0

확인에 사용할 수 있으며, 문제가 다른 자연의 비트이었다 밝혀 : 더 가까이로 볼 때, 나는 multipe 트윗이 twitter_id 2147483647로 저장된 것을 발견 ...입니다 정수 필드의 상한 :

필드를 bigint로 변경하면 문제가 해결됩니다. 가능한 한 MySQL이 자동으로 실패하고 최대 값으로 복귀 했으므로 알아내는 데 오랜 시간이 걸렸습니다. (고유 색인을 추가 할 때까지). postgres를 사용하여 신속하게 테스트 해 보았습니다. 포스트 그레스는 "범위를 벗어난 정수"오류를 반환했으며,이 오류는 여기에서 문제의 실제 원인을 지적했습니다.

Ben이 (가) 유효성 검사 및 색인 생성 팁을 제공해 주셔서 감사합니다. 지금은 훨씬 깨끗한 코드로 이어집니다!

관련 문제