2013-03-26 1 views
1

J'écris une application rails avec un modèle de personne qui ressemble à ceci:Meilleur méthode pour dédupliquer dossiers personnes dans Rails

create_table "people", :force => true do |t| 
    t.string "first_name" 
    t.string "last_name" 
    t.string "email" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

J'ai un processus en deux étapes comme suit:

  1. Fill sur les dossiers des personnes, avec les noms des personnes. Les noms des personnes peuvent avoir des doublons inconnus, dus à des surnoms, etc. Par exemple, "tim smith" et "timothy smith"
  2. Demander une API pour obtenir des correspondances d'adresses électroniques potentielles pour ces personnes.

Après avoir fait que le traitement, je pourrais avoir des données comme:

fiche 1: prenom: tim last_name: smith email: [email protected]

fiche 2: first_name: timothy last_name: smith email: [email protected]

Quelle est la meilleure façon de modéliser les rails? Cates?

MISE À JOUR: CLARIFICATION

Après l'étape 2, je sais comment savoir que ces deux enregistrements sont doubles (à savoir la même personne), ma question est de savoir comment représenter que dans le modèle? Dois-je ajouter un champ de type "duplicate_of_person_id" et mettre l'identifiant du premier enregistrement dans ce champ dans le second enregistrement? Y a-t-il un meilleur moyen?

Répondre

0

Vous n'êtes pas sûr à 100% de ce que vous demandez. Si vous voulez juste trouver des doublons, et, par exemple, les énumérer dans un tableau, vous pouvez créer une méthode comme ceci:

# This isn't particularly efficient, but it should return an array in which 
# each element is a list of duplicated people (assuming we define duplicates 
# by doubled email addresses). 
def self.find_duplicates 
    array = [] 
    self.each do |person| 
    similar = self.find_by_email 
    if similar.count > 1 
    array << similar 
    end 
    end 
    return array 
end 

Si vous ne voulez pas pour permettre des doublons, il suffit de créer une validation Dans votre modèle:

validates :email, :uniqueness => true 

Assurez-vous, avant cela, cependant, pour vous assurer que les courriels sont tous dans le même cas. Vous pouvez faire quelque chose comme ça, encore une fois dans le modèle:

before_validation :format_emails 

def format_emails 
    self.email = self.email.downcase 
end 
+0

des contrôles d'unicité doivent être effectués sur la base de données pour éviter les problèmes de threading et de dérive, supprimer le code compliqué pour gérer ces problèmes et avoir plus d'efficacité. – scones

+0

Problèmes de filetage et de dérive? – Sasha

+1

** Filetage **: deux instances de l'application envoyant les mêmes données en même temps. Les contrôles d'application ne seront pas en mesure d'attraper cela (peut également être appelé une «condition de course», je suppose).** Drifting **: configuration du serveur de base de données maître esclave, où l'esclave n'a pas reçu le nouvel ensemble de données, est interrogé si les données existent et répond franchement non. l'ensemble de données sera dupliqué ensuite. – scones

1

Vous pouvez lier tous les enregistrements ensemble. Le premier schéma qui vient à l'esprit est de garder le record avec l'ID le plus bas en tant que gagnant et de faire en sorte que tous les dupes pointent vers lui. Vous pouvez aussi faire has_and_belongs_to_many, ce qui impliquerait une table séparée où chaque enregistrement dit que ces deux personnes sont identiques. Ce dernier croît cependant quadratiquement avec le nombre de personnes.

Ou, copiez simplement toutes les informations de la seconde dans la première et supprimez la seconde.

Questions connexes