Rails:havingメソッドの使い方

2023/11/10に公開

データを扱う際、集計された結果に基づいて特定の条件を満たすレコードのみを抽出したいという場面に遭遇したことがあると思います。今日は、havingメソッドを使ってこのようなケースをどのように処理するかを見ていきましょう。

havingメソッドの基本

havingメソッドはSQLのHAVING句に対応し、GROUP BYでグループ化されたレコードに対して条件を指定する際に使用します。このメソッドはWHERE句と似ていますが、WHERE句とは違い集計関数(COUNTやSUM、 AVG、MAXなど)を使って条件の指定を行えます。

havingメソッドの使用例

たとえば、ある商品を注文した顧客の数をカウントし、注文数が特定の数を超える顧客だけを取得したい場合、以下のようなRailsのクエリを使います。

Customer.joins(:orders)
        .group(:id)
        .having('COUNT(orders.id) > ?', 10)
このクエリのポイントは次の通りです:

joins(:orders):Orderモデルに関連するCustomerモデルを結合します。
group(:id):顧客のIDごとに結果をグループ化します。
having('COUNT(orders.id) > ?', 10):各顧客が持つ注文数をカウントし、それが10より多い顧客を選択します。

実際の使用場面

# 注文数が多い顧客のリストを取得
high_volume_customers = Customer.joins(:orders)
                                .group(:id)
                                .having('COUNT(orders.id) > ?', 10)
                                .pluck(:id)

# 注文数が多い顧客に基づいてアクションを取る
Campaign.target_customers(high_volume_customers)

Discussion