質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

1603閲覧

データベースからActiveRecordで2つのテーブルから順番に取得したい

sixth13

総合スコア33

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2017/02/04 07:16

編集2017/02/04 07:20

現在Railsにて投稿用のPOSTテーブルとLIKEテーブルが存在してこちらを一対多の関係で
結びつけております。

上記の投稿をいいねが多い順で取得したいのですがどのようにすればいいのでしょうか。

下記では上手くいきませんでした。

Ruby

1@posts = Post.joins(:likes).group(:id).order("count(*) desc")

LIKEテーブルには[post_id][user_id]が入っております。

環境
Mac
Ruby:2.3.1
Rails:4.2.5

大変お手数ではございますがご教示いただければ幸いです。
何かご不明な点等ございましたらお申し付け下さい。

それではよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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:21

編集2017/02/04 09:54
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sixth13

2017/02/04 09:50

ご教示誠にありがとうございます。 @posts = Post.joins(:likes).group("posts.id").order("count_posts_id").limit(10).count("posts.id").keys 上記で試したのですがPOSTテーブルの中身がそのままID順に配列として出ました。 結果例 [90, 89, 88, 87, 86, 85, 84, 83, 82, 81]
sixth13

2017/02/04 09:53

ちなみに最後のkeysを外すとこんな感じとなります。 {90=>14, 89=>12, 88=>13, 87=>8, 86=>9, 85=>7, 84=>9, 83=>12, 82=>17, 81=>12}
katoy

2017/02/04 09:55

order() に desc 指定が抜けてました。 回答のほうも修正しました。
sixth13

2017/02/04 09:57

コンソールだと下記のように出ます。 SELECT COUNT(posts.id) AS count_posts_id, posts.id AS posts_id FROM "posts" INNER JOIN "likes" ON "likes"."post_id" = "posts"."id" GROUP BY posts.id ORDER BY "posts"."created_at" DESC, count_posts_id LIMIT 10
sixth13

2017/02/04 10:02

ご回答誠にありがとうございます。 下記のようにコンソールで書いた結果特に変化はないようです。。 Post.joins(:likes).group("posts.id").order("count_posts_id DESC").limit(10).count("posts.id") SELECT COUNT(posts.id) AS count_posts_id, posts.id AS posts_id FROM "posts" INNER JOIN "likes" ON "likes"."post_id" = "posts"."id" GROUP BY posts.id ORDER BY "posts"."created_at" DESC, count_posts_id DESC LIMIT 10 => {90=>14, 89=>12, 88=>13, 87=>8, 86=>9, 85=>7, 84=>9, 83=>12, 82=>17, 81=>12} なんども申し訳ございません。。。
katoy

2017/02/04 10:43 編集

SQL を見ると "ORDER BY "posts"."created_at" となってますね。 ORDER BY "count_posts_id" となっている原因を探ってみてください。
sixth13

2017/02/04 10:29

出来ました!!! モデルにdefault_scope -> { order(created_at: :desc)}が入っていたのが原因でした! 本当にたすかりました。誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問