2010-05-10 7 views
0

J'ai l'application rails qui a une liste d'utilisateurs. J'ai différentes relations entre les utilisateurs, par exemple travaillé avec, ami, préféré. Lors de la liste des utilisateurs, je dois décider si l'utilisateur actuel peut ajouter un utilisateur spécifique à ses amis.Eager charger cette association de rails

 -if current_user.can_request_friendship_with(user) 
     =add_to_friends(user) 
    -else 
     =remove_from_friends(user) 

    -if current_user.can_request_worked_with(user) 
     =add_to_worked_with(user) 
    -else 
     =remove_from_worked_with(user) 

Le can_request_friendship_with (utilisateur) ressemble à:

def can_request_friendship_with(user) 
    !self.eql?(user) && !self.friendships.find_by_friend_id(user) 
    end 

Mon problème est que cela signifie dans mon cas 4 requête par utilisateur. La liste de 10 utilisateurs signifie 40 requêtes. Pourrais-je en quelque sorte impatient de charger ça?

Répondre

0

Nous allons nous avons random_users et current_user
donc non_firends = random_users - current_user.freindships retournera dans deux requêtes tous non_friends des utilisateurs requête.

En fait, vous pouvez précharger tous vos amis et d'utiliser la méthode include? pour l'amitié Tableau:

@friendships = current_user.friendships 

def can_request_friendship_with(user) 
    !self.eql?(user) && @friendships.include? user 
end 
+0

Votre solution n'est pas le meilleur, mais l'idée est bonne. Dans la fonction can_request_friendship_with, nous ne pouvons pas accéder à cette variable d'instance, mais ce n'est pas un problème. – dombesz

+0

Ce n'était pas une solution complète. Ce dont je parlais est d'exclure votre problème du niveau de DB – fl00r

Questions connexes