groupを利用した少し複雑な処理方法
groupを利用した少し複雑な処理方法
タイトルがうまく思いつかないので、よくわからないと思うのですが。
下記のようなケースを想定した場合の処理について説明します。(自分用備忘録です)
例)ユーザーがゲームをした回数を調べたい、日付毎に確認したい。
user_id = 1 Game.where(user_id: user_id).group("date_format(DATE_ADD(played_at,INTERVAL 9 HOUR), '%Y/%m/%d')").count => {"2021/04/05"=>2}
上記の結果からユーザーidが1のユーザーは"2021/04/05"に2回ゲームをしたことが理解できます。
Game.where(user_id: user_id).
ユーザーidが1のレコードを絞り込みます。
Game.where(user_id: user_id).group("date_format(DATE_ADD(played_at,INTERVAL 9 HOUR), '%Y/%m/%d')")
保存されているplayed_atはMySQL標準のUTCタイムになっているのでDATE_ADD(played_at,INTERVAL 9 HOUR
で+9時間して日本時間に変更します。
さらにdate_formatで日時を整形します。("2021/04/05"みたいな感じに)
Game.where(user_id: user_id).group("date_format(DATE_ADD(played_at,INTERVAL 9 HOUR), '%Y/%m/%d')").count
何日にどれくらいゲームしたかをカウントするためにcountメソッドを利用します。
まとめ
少し複雑なgropuメソッドの利用方法を説明しました。