質問: Post.joins(:likes).group(:id).order("count(*) desc") ``` LIKEテーブルには[post_id][user_id]が入っております。 **環境** Mac Ruby:2.3.1 Rails:4.2.5 大変お手数ではございますがご教示いただければ幸いです。 何かご不明な点等ございましたらお申し付け下さい。 それではよろしくお願い致します。
回答: Idea: has_may :comments Comment: bebongs_to :idea でためしていますが、こんな感じでは如何でしょう。 ``` > idea_ids = Idea.joins(:comments).group('ideas.id').order('count_ideas_id desc').limit(10).count('ideas.id').keys (4.6ms) SELECT COUNT(ideas.id) AS count_ideas_id, ideas.id AS ideas_id FROM "ideas" INNER JOIN "comments" ON "comments"."idea_id" = "ideas"."id" GROUP BY ideas.id ORDER BY count_ideas_id desc LIMIT ? [["LIMIT", 10]] => [980190962, 102] ``` order(...) のところに書く属性名は 生成される SQL を眺めるとわかります。 この場合は、 COUNT(ideas.id) AS count_ideas_id となっているにで、それを指定します。(これはactiverecord 自動でつける名前です) 処理結果の idea_ids は配列ですが、その順番は idea についた comment の数順の多い順になっています。 limit(10) としているので、上位 10 位までを取得します。 SQL の発行回数とか、利用メモリー料のことをかんがえずに ``` Idea.all.map {|idea| [idea.comments.size, idea.id]}.reverse Idea Load (0.2ms) SELECT "ideas".* FROM "ideas" => [[2, 980190962], [1, 102]] ``` みたいに、idea.comemnts.size で idea についたコメント数を取得して ruby 上で処理してしまうこともできます。