2010-05-07 4 views
0

Disons que j'ai un tableau d'objets de la même classe, avec deux attributs de préoccupation ici: name et created_at.Suppression des "objets dupliqués"

Comment puis-je trouver des objets portant le même nom (considérés comme dups) dans le tableau, puis supprimer l'enregistrement en double dans la base de données. L'objet avec la date created_at la plus récente, cependant, est celui qui doit être supprimé.

Répondre

2
seen = [] 
#sort by created date and iterate 
collection.sort({|a,b| a.created_at <=> b.created_at}).each do |obj| 
    if seen.map(&:name).include? obj.name #check if the name has been seen already 
    obj.destroy! 
    else 
    seen << obj #if not, add it to the seen array 
    end 
end 

devrait faire le travail avec espoir.

+0

il y avait erreur de syntaxe, mais je l'ai eu à travailler. THX! – keruilin

+0

Oh, désolé, raté celui-là, devrait être réparé maintenant. –

+0

Il serait préférable de faire 'seen = Set.new'. De cette façon 'include?' Est O (1) au lieu de O (n). –

0

Si cela est juste un bugfix unique avant l'introduction UNIQUE INDEX sur la table, vous pourriez aussi bien le faire dans SQL:

DELETE FROM t WHERE id IN (
    SELECT t1.id 
    FROM t t1 
    LEFT JOIN t t2 ON t1.name = t2.name AND t2.created_at < t1.created_at 
    WHERE t2.id IS NOT NULL 
) 
Questions connexes