技術ブログ

(技術系中心)基本自分用備忘録なので、あくまで参考程度でお願いします。

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メソッドの利用方法を説明しました。