2010-11-21 9 views
0

J'ai réussi à mettre en place une association auto-référencée d'amitié pour users dans mon application Ruby on Rails après avoir suivi Ryan Bates' railscast. Je peux suivre avec succès, ne plus suivre et voir qui suit. Maintenant, je veux tirer un autre élément et je ne suis pas sûr de savoir comment le faire.Comment naviguer dans une association auto-référentielle pour d'autres associations?

User has_many :workouts 

Je veux afficher les séances d'entraînement pour les utilisateurs que je suivais. Un peu comme Twitter affiche des tweets pour les utilisateurs que vous suivez. Cela peut-il faire compte tenu de mes associations ci-dessous ou dois-je configurer un autre, par exemple,

Friendship has_many :workouts, :through => :users. 

Voici le reste des informations de modèle que vous pourriez avoir besoin.

User.rb

has_many :friendships 
    has_many :friends, :through => :friendships 
    has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id" 
    has_many :inverse_friends, :through => :inverse_friendships, :source => :user 
    has_many :workouts, :dependent => :destroy 

Friendship.rb

belongs_to :user 
    belongs_to :friend, :class_name => "User" 

Workout.rb

belongs_to :user 

Si pas d'autres associations nécessaires, quelle est la syntaxe dans le répertoire/utilisateurs/spectacle .html.erb vue pour afficher les séances d'entraînement pour les amis.

MISE À JOUR:

Il semble basé sur la réponse de Josiah Kiehl ci-dessous, je suis en mesure d'obtenir cette fin. Après avoir testé la console par ses conseils, je le code suivant dans la vue:

<% current_user.friends[0].workouts.each do |workout| %> 
    <%= workout.title %><br/> 
<% end %> 

Mais cela semble revenir seulement des séances d'entraînement pour le premier utilisateur que j'ai suivi.

Répondre

0

Vous pourriez probablement faire quelque chose comme ceci:

<% current_user.friends.each do |friend| %> 
<h1><%= friend.name %></h1> 
<% friend.workouts.each do |workout| %> 
<p><%= workout.title %></p> 
<% end %> 
<% end %> 

Important à noter est que pour que cela soit db requête efficace, vous probablement vouloir créer une portée ou une association qui inclut les entraînements directement dans la requête des amis. Vous pouvez bien sûr le faire manuellement comme ceci:

<% current_user.friends.all(:include => :workouts).each do |friend| %> 

Edit:

Si vous souhaitez associer la séance d'entraînement d'amis directement avec current_user, je pense que la meilleure façon est de créer une méthode manuelle pour associer la séances d'entraînement. Le problème avec les associations pures est que vous auriez plusieurs: à travers des appels qui ne sont pas supportés par afaik. De cette façon, il ne générera pas au moins plus de deux appels db. D'abord charger les identifiants d'amis puis charger tous les entraînements associés à l'un de ceux-ci.

+0

J'espérais intégrer tous les entraînements d'amis dans un flux. Le premier bit de code fonctionne pour la liste des séances d'entraînement par des amis, et quand j'utilise la seconde, j'obtiens une erreur «méthode non définie pour l'entraînement». – bgadoci

+0

pour être plus précis l'erreur est: 'méthode indéfinie' workout 'pour # ' – bgadoci

+0

Aussi ... J'ai besoin d'avoir les entraînements affichés: order =>" created_at DESC " – bgadoci

0

-vous des problèmes lorsque vous faites quelque chose comme ceci:

a = User.last 
a.friends[0].workouts 
+0

J'ai 'NoMethodError: méthode indéfinie 'workouts' pour rien: NilClass – bgadoci

+0

en fait quand j'ai fait ce qui précède sur l'utilisateur d'abord, il semblait fonctionner ... quelle serait la syntaxe correcte dans la vue de l'appeler? – bgadoci

+0

J'ai mis à jour ma question. – bgadoci