2010-11-30 13 views
4

J'ai un simple rail 3 application de blog où les messages ont beaucoup de commentaires et de commentaires appartiennent à un poste.Trouver tous les messages avec plus d'un nombre défini de commentaires

Je souhaite créer une étendue qui récupérera tous les messages comportant plus de 5 commentaires. Quelle est la meilleure façon de le faire sans colonne de cache de compteur.

Répondre

8

Comme ceci, peut-être?

Post.select('posts.*, count(comments.id) as comment_count'). 
    joins(:comments). 
    group('posts.id'). 
    having('comment_count > 5') 
+0

Cela ne semble pas fonctionner pour moi. Il ne renvoie que le premier enregistrement. Le paramètre comment_count est également défini sur le nombre total de tous les commentaires dans la base de données. – KJF

+0

Je l'ai mis à jour pour inclure une clause GROUP BY. Cela vous arrange-t-il? – noodl

+0

Notez également que vous devriez pouvoir appeler 'post.comment_count' sur chacun des enregistrements retournés. – noodl

0

Bonne réponse de noodl ... merci pour ça!

Je devais trouver - pour coller avec les classes par exemple de la question initiale - les 4 messages qui ont été le plus récemment formulé des commentaires sur ... une légère variante de la réponse de noodl le tour est joué:

Post.select('posts.*, max(comments.created_at) as last_commented_at'). 
    joins(:comments). 
    group('posts.id'). 
    order('last_commented_at DESC'). 
    limit(4) 

Merci !

4

Dans Postgres 9.1 J'ai dû régler les choses comme ça car postgres n'est pas content de mettre des conditions sur des champs calculés ou quelque chose comme ça.

Post.select('posts.*, count(comments.id) as comment_count'). 
    joins(:comments). 
    group('posts.id'). 
    having('count(comments.id) > 5')