LoginSignup
0
0

More than 1 year has passed since last update.

【Rails6】1対多のアソシエーションが組まれている場合に子モデルが多い順にソートする

Posted at

前提

以下のような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もっと勉強したいな〜と思いました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0