はじめに
久々にRailsを弄っているがちょっと詰まったので。
環境
Ruby 2.6.6
Rails 6.0.4.1
MySQL 14.14
やりたかったこと
適当な例として、商品名,販売価格,販売日を持つ売上テーブルがある。
中身はこんな感じ。
売上テーブル中身
select name,money,date from sales;
えんぴつ,300,2021-11-01
消しゴム,100,2021-11-01
ボールペン,400,2021-11-03
A4用紙,500,2021-11-03
ものさし,400,2021-11-03
万年筆,8000,2021-11-04
替え芯,500,2021-11-04
これを販売日ごとに売上金を合計(sum)して、その集計した列に名前をAS句で別名をつけたかった。
普通にActiveRecordで集計すると列名に応じて自動で集計列が命名される。
日付ごとに売上金を集計するActiveRecord
@sale = Sale.select("date").group("date").sum("money")
実際に発行されるSQL
SELECT SUM(`sales`.`money`) AS sum_money,
`sales`.`date` AS sales_date
FROM `sales`
GROUP BY `sales`.`date`
このASとなっている所を手動で設定したかったが、中々上手くいかなかった。
結論
調べてみたらselectメソッドにそのままSQL文を書くらしい。ええ・・・
日付ごとに売上金を集計するActiveRecord(AS句で列名を指定)
@sale = Sale.select("sum(money) as total_money, date").group("date")
実際に発行されるSQL
SELECT SUM(`sales`.`money`) AS total_money,
`sales`.`date`
FROM `sales`
GROUP BY `sales`.`date`
CASE文とかも同様の方法で使えるらしい。
おわりに
railsはなるべく素のSQL文を書かないようにしていたのでちょっと違和感。
参考