2009-08-19 8 views
0

Ce n'est peut-être pas la meilleure solution dans la plupart des cas, mais je veux une table avec des données de 3 tables.Besoin de données d'un grand nombre: beaucoup rejoignent une vue Rails

class Media < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :type 
    has_many :ratings           
end 

class User < ActiveRecord::Base 
    has_many :medias 
    has_many :ratings 
end 

class Rating < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :media 
end 

Cest la vue que je veux

<table> 
    <tr> 
    <th>Name</th> 
    <th>Comment</th> 
    <th>Creator</th> 
    <th>Type</th> 
    <% for user in @users %> 
     <th><%=h user.login %></th> 
    <% end %> 
    </tr> 

<% for media in @medias %> 
    <tr> 
    <td><%=h media.name %></td> 
    <td><%=h media.comment %></td> 
    <td><%=h media.user.login %></td> 
    <td><%=h media.type.name %></td> 
    <% for user in @users %> 
     <td><%=h GET_RATING (media, user) %></td> 
    <% end %>%> 
    </tr> 
<% end %> 
</table> 

Basiquement je veux une nouvelle ligne pour chaque utilisateurs d'évaluation pour chaque média

Ce que je veux un tableau qui ressemble à ce que:

media.name media.comment ... rating(media, user).rating 

Je pense qu'il serait préférable d'utiliser une jointure dans le contrôleur avec les méthodes de recherche de média mais je ne sais pas h ow exactement, une solution possible plus large pourrait être une méthode d'assistance qui prend en charge les médias et l'utilisateur en tant que paramètres.

Selon vous, quelle est la meilleure solution pour cela?

Répondre

1

Ce type d'association appartient à votre modèle, une relation de plusieurs à travers est parfaite pour cela.

class User < ActiveRecord::Base 
    has_many :ratings 
    has_many :media, :through => :ratings 
end 

class Media < ActiveRecord::Base 
    has_many :ratings 
    has_many :users, :through => ratings 
end 

class Rating < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :media 
end 

Ensuite, vous pouvez accéder à

media.name media.comment 

Alors peut également accéder à

user.ratings 

ou:

<% media.users.each do |user| %> 
    ## Do stuff with user.ratings array 
<% end %> 

Vous pouvez également:

media.ratings.each do |rating| 
    rating.your_attribute 
    rating.user.your_attribute 
end 
+0

merci beaucoup, mais je ne l'ai pas terminé complet: <% media.users.each do | rater | %> <% rater.ratings.each do | Évaluation | %> <% = h rating.rating%> <% end %> <% end %> qui est ce que j'ai en ce moment, le problème est quand un utilisateur n'a pas donné une note, il est pas dans la liste media.users si Je reçois une table avec un nombre de td différent par ligne. –

+0

non, cela ne fonctionne pas. avec media.users J'obtiens tous les utilisateurs qui ont donné une note pour ce film. Avec media.users.ratings, j'obtiens toutes les évaluations que l'utilisateur a données mais pas seulement pour ce média. Donc, si je donne une note en tant qu'utilisateur A pour le film 1 et une autre note pour le film 2 et puis je reçois pour le film 1 à la fois les votes et aussi pour le film 2 les deux votes. Par conséquent, la solution n'est pas valide ou seulement partielle. –

+0

C'est la bonne technique. Vous devez remplir l'association. – nitecoder

Questions connexes