2009-11-20 2 views
1

Je suis nouveau à Rails, alors allez-y doucement. J'ai créé un blog et j'ai également créé la possibilité pour les utilisateurs d'indiquer qu'ils "aiment" un article en particulier. La façon dont j'applique ceci est en utilisant la table des postes et une table distincte «vote». Lorsque l'utilisateur clique sur le bouton «J'aime», il envoie l'enregistrement à la table «vote» avec la valeur «1» et l'identifiant de publication particulier.Affichage des articles selon le nombre de dossiers «votes» dans un tableau distinct

Je voudrais afficher les messages "les plus aimés" dans la barre latérale. Comment puis-je appeler une telle chose. Je voudrais afficher le post_title et le nombre de «votes», c'est-à-dire, je voudrais interroger en quelque sorte la table «vote» pour les post_id's qui ont le plus d'enregistrements et les afficher dans l'ordre décroissant.

J'espère que c'est une question facile.

+0

Avez-vous 1 enregistrement par vote dans le tableau des votes ou un enregistrement par publication avec le total des votes? – mikej

Répondre

2

Il existe plusieurs façons d'y parvenir, mais sans doute le plus polyvalent et Rails-ish serait de créer un module avec une méthode pour faire le classement, et ensuite toutes les classes ou les associations qui peuvent être « Liked "étendre ce module.

# lib/likable.rb 
# 
module Likable 
    def most_liked (limit = 10) 
    # This may be possible without a find_by_sql... see the API docs. 
    find_by_sql("SELECT Posts.*, SUM(votes.count) AS num_votes FROM Posts, Votes WHERE Posts.id = post_id GROUP BY post_id ORDER BY num_votes DESC LIMIT #{limit}") 
    end 
end 

# app/models/post.rb 
# 
require 'likable' 

class Post < ActiveRecord::Base 
    extend Likable 
    # ...whatever else you've got in here 
end 

# app/models/user.rb (or any other model with things that can be "liked") 
# 
require 'likable' 

class User < ActiveRecord::Base 
    has_many :posts, :extend => Likable 
    # ...the rest of the User class 
end 

Cela vous permet de faire des choses comme ...

Post.most_liked     # => an array of the 10 most liked posts 
@some_user.posts.most_liked(5) # => that user's 5 most liked posts 

Si vous avez besoin plus tard, vous pouvez ajouter des méthodes au module pour voir, par exemple, le nombre de votes un poste particulier a. Vous pouvez également changer le post_id en target_id en Vote et en faire une association polymorphe, et ensuite vous pouvez utiliser votre module Likable pour voter pour n'importe quoi, pas seulement pour les messages (vous devez généraliser l'appel à trouver dans most_liked si vous avez fait cela).

2

Il est préférable de le faire en ajoutant un cache de compteur au modèle de publication, évitant ainsi le comptage de la base de données sur chaque chargement.

Cette railscast episode explique comment configurer le cache du compteur.

En supposant que vous ayez nommé votre compteur de votes votes_count, vous pouvez le faire pour obtenir les 10 messages les plus populaires de votre contrôleur.

@popular_posts = Post.find(:all, :limit => 10, :order => "votes_count DESC") 
Questions connexes