Je récupère périodiquement les derniers tweets avec un hashtag donné et les enregistre localement. Afin d'éviter d'enregistrer des doublons, j'utilise la méthode ci-dessous. Malheureusement, il ne semble pas fonctionner ... alors quel est le problème avec ce code:Suppression des doublons d'un tableau avant l'enregistrement
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
Où @tweets est un tableau de Tweet objets tiré par les cheveux de twitter. J'apprécierais toute solution qui fonctionne et surtout celle qui pourrait être plus élégante ...
validate_uniqueness_of: twitter_id ce n'est pas une bonne solution. Entre le moment où il vérifie l'existence de l'enregistrement et qu'il crée un nouvel enregistrement, un autre processus peut créer un doublon. Vous devriez toujours utiliser cette méthode en conjonction avec un index de base de données. –
@weppos: Comme je n'ai qu'un seul travail d'écriture séquentielle des tweets, ce n'est pas un problème. Cela semble être la solution la plus "sèche". J'ai bien travaillé sur sqlite3, mais en mode production/mysql il ne semble pas y avoir de doublons ... en train d'y jeter un coup d'oeil maintenant. – effkay
pour la sécurité réelle, vous devez mettre des contraintes d'unicité sur la base de données et être juste prêt à gérer les exceptions qui sont levées –