2010-01-11 2 views
3

게시물 has_many이 댓글 마지막 코멘트 날짜별로 게시물을 주문합니다. 따라서 각 게시물의 가장 최근 코멘트로 주문한 명명 된 범위를 원합니다.named_scope 내가 이름 범위로 주문합니다 <a href="http://github.com/binarylogic/searchlogic" rel="nofollow noreferrer">searchlogic</a>을 사용하고</p> <p>

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

나는 가장 최근의 코멘트와 종류의 created_at 필드함으로써, named_scope의 모든 :joins을 얻을하는 방법을 모르겠어요.

mysql, fyi를 사용하고 있습니다.

편집 : 이것은 내가 모방하려고 할 것 SQL 쿼리입니다

:

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; 

답변

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" 
: 트릭을 할 것입니다

최적화를 시도 할 수는 있지만 제대로 작동하고 몇 가지 힌트를 제공해야합니다.

편집 :

후 편집 된 질문은 내부에 가입하지 않으려는 것을 보여, 당신은 :joins => :comments와 물론 변화 :joins => "..."의 수 (코멘트를하지 않고 게시물을?).

+0

나는 가장 단순한 경우를 생각하고있었습니다. 나는 INNER JOIN에서 일하는 사람을 얻은 후에 LEFT JOIN으로 전환 할 수 있다고 생각했습니다. 또한 이것은 헬프 데스크를위한 것이며 모든 "게시물"에는 초기 "주석"이 있으므로이 경우에는 내부 조인을 사용해도됩니다. – wesgarrison

+0

나는 다른 사람이 commment.id도 가져 오기를 원할 경우를 대비해': group => "posts.id"'를 추가했습니다. searchlogic 및 will_paginate와 완벽하게 작동합니다. – wesgarrison

1

당신이 할 수있는 그 다음과 같이 범위를 통해 뭔가를 관련 모델을 결합하거나 포함하여

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

+0

INNER JOIN을 (를) 사용하는 여러 주석은 중복 게시물을 제공합니다. 모든 댓글과 관련 게시물을 선택합니다. – wesgarrison

+0

이 티켓 (http://bit.ly/75FrSi)에 따르면 named_scopes는 단일 객체를 반환하면 안됩니다. 그것은 스코프 (scoping)가 아닌 파인더 (finder)입니다. 또한,이 경우, 'ascend_by_comment.first'를 사용하여 모두 대신 1 개의 레코드 만 반환하도록 제안합니다. 유용하다고 생각하길 바랍니다. – jpemberthy

+0

이름이 지정된 범위가 하나의 게시물을 반환하는 것을 원하지 않습니다. 마지막 댓글을 통해 게시물을 주문하고 싶습니다. 이 named_scope는 Comment 모델이 아닌 Post 모델에서 살 수 있습니다 (적어도 그것이 올바르게 작동 할 것이라고 생각합니다). 따라서 포스트 당 하나의 주석, 특히 최신 코멘트를 조회해야합니다. – wesgarrison