はじめに
レコードを抽出する際に関連データの数で絞り込みたいことがありますが毎回「大体こんな感じだったけどあってたっけ?」てなるのでまとめておく。
ActiveRecordのTipsは今後も出していきたいので「こんな抽出はどうやるの?」的なものがあればコメントください!
関連データの数による検索
1対Nの関連付けのテーブル構造で子の数によっての検索
nとかmとかは数字に置き換えてください。
子レコードがない親レコードの抽出
Parent.left_outer_joins(:children)
.where(children: { id: nil })
子レコードがn個以上
Parent.joins(:children)
.group('parents.id')
.having('COUNT(children.id) >= ?', n)
.select('parents.*, COUNT(children.id) as children_count')
子レコードがn個以下
Parent.joins(:children)
.group('parents.id')
.having('COUNT(children.id) <= ?', n)
.select('parents.*, COUNT(children.id) as children_count')
子レコードがm個以上n個以下
Parent.left_joins(:children)
.group('parents.id')
.having('COUNT(children.id) BETWEEN ? AND ?', m, n)
子レコードが一番多いレコードの取得
Parent.joins(:children)
.select('parents.*, COUNT(children.id) AS children_count')
.group('parents.id')
.order('children_count DESC')
.first
最後に
間違っている箇所があればコメントください🙇♂️
またrailsでできるお仕事くらはい🙏