2010-10-15 5 views
1

Je travaille sur une application de réseautage social et j'essaie de construire une requête complexe qui tire efficacement tous les amis checkins des utilisateurs de la base de données. Fondamentalement, je besoin: « user.friends.checkins »Lutte avec une requête Rails 3 complexe (besoin: user.friends.checkins)

J'ai recréée (sous forme simplifiée) la structure de données ci-dessous pour référence et inclus plusieurs solutions que j'ai trouvé, mais je me sens comme mes solutions sont sous optimal. J'espère que quelqu'un peut pointer une meilleure façon ... Voici donc ce:

J'ai essayé cette première, qui fonctionne, mais est trop lent, étant donné que les utilisateurs ont généralement +1000 amis: chaque

=> Checkin.where(:user_id => self.friends) 

Alors j'ai essayé ce qui fonctionne également et est beaucoup plus rapide, mais se sent bâclée:

=> Checkin.joins(:user).joins('INNER JOIN "friendships" ON 
"users"."id" = "friendships"."friend_id"').where(:friendships => 
{:user_id => 1}) 

Toute aide que vous pouvez fournir serait grandement appréciée! Merci au avancez !!!

=== Structure des données ===

Users table has columns: id, name 
Friendships table has columns: user_id, friend_id 
Checkins table has columns: id, location, user_id 

modèles === === de

class User 
has_many :friendships 
has_many :friends, :through => :friendships 
has_many :checkins 
end 

class Friendship 
belongs_to :user 
belongs_to :friend, :class_name => 'User' 
end 

class Checkin 
belongs_to :user 
end 

Répondre

0

meilleure solution que j'ai trouvé jusqu'à présent:

Checkin.joins(:user => :friendships).where('friendships.friend_id' => self.id) 
0

La première requête doit vous servir. Ajoutez des index aux champs de clé étrangère dans la requête.

+0

Le problème avec la première solution est qu'il faut 3 secondes pour charger les objets 500-1000 ActiveRecord qui sont retournés par « self.friends ». Ce n'est pas SQL qui est lent (le SQL ne prend que 2-3ms), c'est ActiveRecord. Je viens de poster une autre solution que j'ai découverte qui semble être une amélioration. –