1

以下のクエリを使用して、日ごとに分類されたチェックインの数を取得します。

Checkin.select("date(created_at) as calendar_day, count(*) as total_checkins").where("user_id = ? AND created_at > ?", user.id, 28.days.ago).group("date(created_at)").order("date(created_at)")

出力例:

出力例

私が直面している問題は、このクエリが UTC であり、config.time_zone の下の application.rb ファイルで設定した Time.zone (PST) に変換されないことです。上記の例では、最後の 2 つのチェックインは「2012-07-30」の下にある必要があります。

他のクエリでは、この変換が正常に機能することを知っています。たとえば、次のようにします。

Checkin.last.created_at # Returns in PST

したがって、上記のクエリの複雑さについての何かに違いありません。私はそれがselect文である可能性があると推測しています。構成されたタイムゾーンを説明するために上記をどのように書くことができますか?

4

2 に答える 2

4

私は同じ種類のことをしています(分単位でグループ化していますが)...以下のコードを使用するとうまくいきます...

Time.zone.utc_to_local(DateTime.parse(@checkin[:calendar_day]))

グループ内の各アイテムに対してこれを行い、配列ハッシュをビュー レイヤーに渡します。

于 2012-10-30T08:09:53.830 に答える
0

日ごとにアクティビティをグループ化しようとして、この同じ問題に遭遇しました(これはハイチャートグラフ用です)。私はこのようなことをしたかったでしょう:

# Didn't work
counts = Event.where(:created_at => start_date..end_date.end_of_day)
.group("DATE(created_at)").count

return (start_date..end_date).map{ |d| counts[d] }

しかし、start_date と end_date はローカル タイムゾーンで、DATE 関数は UTC でした。代わりに、Ruby でこれを行いました。

counts = Event.where(:created_at => start_date..end_date.end_of_day)
.pluck(:id, :created_at)
.group_by{|obj| obj[1].to_date}

return (start_date..end_date).map{ |d| counts[d].try(:size) }
于 2015-03-25T04:45:54.117 に答える