前提
以下のような1対多のアソシエーションを組んだモデルを使ってRailsアプリを実装しています。
booksテーブル
Column | Type | Options |
---|---|---|
isbn | string | null: false, unique: true |
title | string | null: false |
author | string | null: false |
author_kana | string | null: false |
publisher_name | string | null: false |
sales_date | string | null: false |
item_price | integer | null: false |
item_url | text | null: false |
image_url | text | null: false |
Associations
- has_many :awarenesses
awarenessesテーブル
Column | Type | Options |
---|---|---|
content | string | null: false |
user | references | null: false, foreign_key: true |
book | references | null: false, foreign_key: true |
Associations
- belongs_to :book
Bookモデルが書籍情報で、Awarenessesモデルが書籍を読んでの気付きの情報を持っています。
カラムの中身を個別に解説することは今回はしません。
このような場合にBookモデルのデータをAwarenessesモデルのデータが紐付いている数が多い順にソートしたい。
結論
以下のコードでいけました。
Book.left_joins(:awarenesses).group(:id).order('count(book_id) DESC')
ポイント
ポイントはleft_joinsを使う点です。
left_joinsは関連するモデルデータを同時に引っ張ってくれるメソッドですが、joinsと異なり関連モデルのデータ存在しない
レコードも引っ張ってきてくれます。
joinsとleft_joinsの違いは以下の記事がわかりやすかったです。
僕が説明するよりこっちをみてもらったほうがわかりやすいと思います。(~解説がめんどくさい~)
https://pikawaka.com/rails/left_joins
感想
単純な一覧表示でしたが案外難しかったです。
SQLもっと勉強したいな〜と思いました。