2010-01-11 7 views
3

Messages has_many Commentairesnamed_scope commander les messages de la dernière date de commentaire

J'utilise searchlogic qui commande par named scopes. Donc, j'aimerais que la portée soit classée en fonction du commentaire le plus récent de chaque publication.

named_scope :ascend_by_comment, :order => ...comments.created_at??... 

Je ne suis pas sûr de savoir comment faire un :joins et obtenir que les plus récents commentaires et trier par son champ created_at, le tout dans un named_scope. J'utilise mysql, fyi.

EDIT:

Ceci est la requête SQL que je serais en train d'imiter:

SELECT tickets.*, comments.created_at AS comment_created_at FROM tickets 
INNER JOIN 
(SELECT comments.ticket_id, MAX(comments.created_at) AS created_at 
    FROM comments group by ticket_id) comments 
ON tickets.id = comments.ticket_id ORDER BY comment_created_at DESC; 

Répondre

1
named_scope :ascend_by_comment, 
    :joins => "LEFT JOIN comments ON comments.post_id = posts.id", 
    :group => "id", 
    :select => "posts.*, max(comments.created_at) AS comment_created_max", 
    :order => "comment_created_max ASC" 

Vous pouvez essayer de l'optimiser, mais cela devrait fonctionner et vous donner quelques conseils sur la façon de le faire.

Modifier:

Une fois question Edité et montré que vous voulez INNER JOIN, vous pouvez bien sûr changer :joins => "..." avec :joins => :comments (pas de messages sans commentaires?).

+0

J'allais pour le cas le plus simple. Je me suis dit que je pourrais passer à un LEFT JOIN après avoir travaillé avec INNER JOIN. En outre, ceci est pour un helpdesk et chaque "poste" a un "commentaire" initial ainsi je suis d'accord avec l'utilisation d'INNER JOIN dans ce cas. – wesgarrison

+0

J'ai ajouté ': group =>" posts.id "' pour plus de clarté dans le cas où je/quelqu'un d'autre veut tirer dans le commment.id aussi bien. Fonctionne parfaitement avec searchlogic et will_paginate. – wesgarrison

1

Vous pouvez le faire en se joignant ou y compris le modèle associé par la portée, quelque chose comme ça fera l'affaire:

named_scope :ascend_by_comment, :joins => :comments, :order => "comments.created_at DESC"

+0

Plusieurs commentaires avec un INNER JOIN donneront cependant des messages en double. C'est en sélectionnant TOUS les commentaires et le post associé. – wesgarrison

+0

Selon ce ticket (http://bit.ly/75FrSi) named_scopes ne doit pas renvoyer un seul objet. C'est la portée, pas un chercheur, aussi ils suggèrent d'utiliser, dans ce cas, 'ascend_by_comment.first' pour retourner seulement 1 enregistrement au lieu de tous, J'espère que vous le trouverez utile! – jpemberthy

+0

Je ne veux pas que ma portée nommée renvoie un message. Je le veux commander les posts par leur dernier commentaire. Ce named_scope vivrait dans le modèle Post, pas dans le modèle Comment (du moins, c'est comme ça que je pense que ça devrait marcher). Donc, je dois rechercher un et un seul commentaire par article, en particulier le dernier. – wesgarrison

Questions connexes