3

投稿has_manyコメント

名前付きスコープで並べ替えるsearchlogicを使用しています。そこで、各投稿の最新のコメント順に並べ替える名前付きスコープが欲しいのです。

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

:joinsを実行して最新のコメントのみを取得し、そのcreated_atフィールドですべてを並べ替える方法がわかりませんnamed_scope

私は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;
4

2 に答える 2

1

スコープを介して関連するモデルを結合または含めることでこれを行うことができます。次のような方法でうまくいきます。

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

于 2010-01-11T20:37:33.533 に答える
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 => "..."ます:joins => :comments

于 2010-01-11T20:55:55.350 に答える