web-dev-qa-db-ja.com

週/月/その他およびActiveRecordによるグループ化?

製品で静力学計算を行っています。ユーザーがいくつかの操作を実行したとします。たとえば、コメントを投稿したとします。過去1か月間、または過去1年間に1週間あたりに投稿したコメントの数を表示できるようにしたいと思います。

このようにグループ化するためにactiverecordを使用する方法はありますか?これを手動で簡単に行うのが最善の方法ですか?自分の基準に基づいてレコードの合計を反復処理するのですか?

class User < ActiveRecord::Base
  has_many :comments
end

class Comments < ActiveRecord::Base
  belongs_to :user
end

@user.comments(:all).map {|c| ...do my calculations here...}

それとももっと良い方法がありますか?

ありがとう!オーレン

36
teich

この場合、私にとって最良の解決策は、直接SQLで実行するか、Ruby group_by関数を使用することです。

@user.all.group_by{ |u| u.created_at.beginning_of_month }
31
teich

Postgresでできること:

@user.comments.group("DATE_TRUNC('month', created_at)").count

取得するため:

{"2012-08-01 00:00:00"=>152, "2012-07-01 00:00:00"=>57, "2012-09-01 00:00:00"=>132}

グループ化には「マイクロ秒」から「ミレニアム」までの値を受け入れます。 http://www.postgresql.org/docs/8.1/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC

82

これはより洗練されたバージョンです

@user.comments.group("year(created_at)").group("month(created_at)").count
23
Ahmad Hussain

私の推測は次のようなものです:

@user.comments.count(:group => "year(created_at),month(created_at)")

ドライコード、ymmv

13

Group_byを使用する

@user.comments.group_by(&:week)

class User < ActiveRecord::Base
  def week
    some_attribute_like_date.strftime('%Y-%W')
  end
end

これにより、YYYY-WWの形式でグループ化されたリストが表示されます

3
Austio

グループの日付の宝石をチェックしてください

https://github.com/ankane/groupdate

最近のコミットがあり、postgresqlで動作し、グラフキックと簡単に統合して高速グラフ化し、タイムゾーンで動作します。

2
Pavan Katepalli

Has_activityプラグインを確認してください。

2
Jim Gilliam