2010-11-23 7 views
5

Comment sélectionner tous les enregistrements groupés par colonne triés par created_at desc.Rails 3: group =>: field trié par created_at desc

Je pourrais vouloir récupérer tous les derniers commentaires pour chaque article. Peu importe ce que je fais le groupe (: article_id), retournera toujours le commentaire le plus ancien.

Cordialement. Asbjørn Morell

Répondre

3

Vous ne trouverez pas une réponse facile avec SQL - groupe se produit avant tri (puisque le groupe est généralement pour les données agrégées). Conservez simplement un champ latest_comment_id dans votre enregistrement Article, puis joignez les commentaires sur latest_comment_id lorsque vous trouvez vos articles.

Si vous voulez plusieurs commentaires par article, vous devrez recourir à plusieurs requêtes ou maintenir une table temporaire avec les derniers commentaires par article.

16

Quelque chose comme:

Comment.order('created_at DESC').all 

Cela devrait le faire :)

Si vous voulez juste le premier résultat, utilisez first au lieu de all. Vous pouvez également utiliser limit. Pour obtenir les exemple 5 premiers résultats:

Comment.order('created_at DESC').limit(5).all 
+0

Mais comment évitez-vous de sélectionner plusieurs enregistrements pour chaque article? J'ai besoin d'un seul commentaire pour chaque article - trié par créé à. – atmorell

+0

Eh bien, je ne suis pas sûr que vous pouvez faire avec les aides de Rails seulement. Cela semble assez compliqué! J'ai fait quelques recherches sur Google et je l'ai trouvé: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ . Est-ce ce que vous essayez de faire? Quoi qu'il en soit, s'il vous plaît poster votre solution si vous en trouvez un;) –

+0

C'est exactement ce que je suis en train de faire. Va chercher la solution avec une colonne latest_comment_id dans mon modèle Articles. – atmorell

1
Comment.group(:article_id).order('created_at DESC') 
+1

Ne fonctionne pas. La requête sélectionnera tous les commentaires groupés par article_id, mais la commande aura lieu après la partie de groupe - vous obtiendrez le commentaire le plus ancien. – atmorell

Questions connexes