🐾
【Ruby on Rails/ActiveRecord】たくさんJoinしたテーブルで一意なレコードを取得する方法
はじめに
この記事では、RailsでActiveRecordを使っているときに、たくさんのテーブルをJoinした場合に、一意なレコードを取得する方法について説明します。
group
を使うときには取得するカラムの工夫が必要で、うまくいかないことも多いです。この記事は、そんな問題に悩んでいる方に向けたものです。
結論としては、distinct
を使うと良いですよ、という内容をお伝えします。
こんな時困る...
例えば、学校をカテゴリーとエリアで検索する場合、それぞれが別テーブルで管理されていると困りますよね。
サブクエリを使うとパフォーマンスが低下することがあり、クエリも複雑になってしまいます。関連するテーブルをJOINで結合して、重複行を除外できれば楽なのですが…
これで解決!
そんな時は、メインのテーブルのレコードにdistinct
をつけると解決します!
手順は以下の通りです。
- メインのテーブルにサブテーブルを結合します。
- サブテーブルを条件で絞ります。
- メインテーブルに
distinct
をつけます。
これで、メインテーブルの重複を除外することができます。
コードで書くと以下のようになります:
schools = School.
joins(:school_categories, :school_areas).
where(school_categories: { category: category }, school_areas: { area: area }).
distinct
注意点
- 必ずしも
distinct
がパフォーマンスの面で最適ではありません。 - 集計やグループ化などの場合は、
distinct
ではなくgroup
を使う方が良いとされています。 - パフォーマンスの結果を見て検討してください。
最後に
distinct
を使うと簡単に重複レコードを除外できます。便利なので使ってみてください。
フィードバックや質問は大歓迎です。お手柔らかにお願い致します!
Discussion