2010-08-29 10 views
0

J'utilise la gemme «contacts» dans les rails pour récupérer les contacts d'un utilisateur à partir de leur application de messagerie. Elle retourne les contacts comme ceci:Comparaison d'un tableau avec un autre dans les rails

["person name", "[email protected]"], ["person name", "[email protected]"], ["person name", "[email protected]"] etc... 

Je veux comparer cette liste aux utilisateurs déjà inscrits pour mon site

Users.find (: all) retourne:

[#<User id: 11, login: "examplelogin", email: "[email protected]">, #<User id: 12, login: "examplelogin", email: "[email protected]">, etc... ] 

Qu'est-ce que est le meilleur moyen de comparer les e-mails de contact Gmail aux emails des utilisateurs et d'afficher uniquement ceux qui correspondent?

Je pensais quelque chose comme:

@contacts = Contacts::Gmail[params[:from]].new(params[:login], params[:password]).contacts 
@contacts.each do |c| 
    @email = c[1] 
    @user = Users.find_by_email(@email) 
end 

Ce qui serait probablement retourner que les utilisateurs où il y avait un match. J'ai l'impression qu'il doit y avoir une meilleure façon de faire ce que je ne considère pas. Aucune suggestion?

Répondre

2
@users = Users.find_all_by_email(@contacts.collect{|contact| contact[1]}) 

modifier:

Ce que vous aviez avant exécuterait une découverte pour chaque contact et vous laisser seulement le résultat de la dernière requête, que ce soit un utilisateur ou non selon que l'on existait avec cet e-mail. Cela effectue une requête et renvoie un tableau de toutes les correspondances réussies:

where 'users'.'email' in array_of_email_addresses. 
+1

a travaillé comme un charme! Est-ce juste une façon sténographique de faire ce que j'ai décrit ci-dessus? – goddamnyouryan

+0

Pas vraiment, j'ai édité mon post. :) – mark