ちょっと複雑なクエリを 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)
再见!!!