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 上で処理してしまうこともできます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/04 09:50
2017/02/04 09:53
2017/02/04 09:55
2017/02/04 09:57
2017/02/04 10:02
2017/02/04 10:43 編集
2017/02/04 10:29