ちょっと複雑なクエリを ActiveRecord で発行してみた

今回は ActiveRecord を利用して、以下の要件の通り、ちょっと複雑なクエリを発行したいと思います。

  • 最新の予約日時よりも後に注文が行われたユーザーを取得する
  • 注文を持つが、予約を持たないユーザーも考慮する

ポイントは user を group しているところと、予約がない場合を考慮した CASE 文だよ。

classDiagram

Order "0..N" --> "1" User
Reservation "0..N" --> "1" User

class Order {
 * 注文
 ordered_at
}

class Reservation {
 * 予約
 reserved_at
}
Users.from(
  Users.joins(:orders).left_joins(:reservation).group(:id).
  select("CASE WHEN count(reservation.id) = 0 THEN 'true' ELSE max(orders.ordered_at) > max(reservations.entered_at) END as is_target"),
  :users
).where(is_target: true)

再见!!!