🐾

【Ruby on Rails/ActiveRecord】たくさんJoinしたテーブルで一意なレコードを取得する方法

2024/06/14に公開

はじめに

この記事では、RailsでActiveRecordを使っているときに、たくさんのテーブルをJoinした場合に、一意なレコードを取得する方法について説明します。

groupを使うときには取得するカラムの工夫が必要で、うまくいかないことも多いです。この記事は、そんな問題に悩んでいる方に向けたものです。

結論としては、distinctを使うと良いですよ、という内容をお伝えします。

こんな時困る...

例えば、学校をカテゴリーとエリアで検索する場合、それぞれが別テーブルで管理されていると困りますよね。

サブクエリを使うとパフォーマンスが低下することがあり、クエリも複雑になってしまいます。関連するテーブルをJOINで結合して、重複行を除外できれば楽なのですが…

これで解決!

そんな時は、メインのテーブルのレコードにdistinctをつけると解決します!

手順は以下の通りです。

  1. メインのテーブルにサブテーブルを結合します。
  2. サブテーブルを条件で絞ります。
  3. メインテーブルにdistinctをつけます。

これで、メインテーブルの重複を除外することができます。

コードで書くと以下のようになります:

schools = School.
  joins(:school_categories, :school_areas).
  where(school_categories: { category: category }, school_areas: { area: area }).
  distinct

注意点

  • 必ずしもdistinctがパフォーマンスの面で最適ではありません。
  • 集計やグループ化などの場合は、distinctではなくgroupを使う方が良いとされています。
  • パフォーマンスの結果を見て検討してください。

最後に

distinctを使うと簡単に重複レコードを除外できます。便利なので使ってみてください。

フィードバックや質問は大歓迎です。お手柔らかにお願い致します!

Discussion