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
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. –