Rails按日期分组计数

时间:2013-02-25 19:53:10

标签: ruby-on-rails ruby activerecord group-by

我的表中有以下数据列(使用Postgres):

occurred_at, name
2012-01-01, Ryan
2012-01-01, Ryan
2012-01-01, Mark
2012-01-01, Ryan
2012-01-01, Paul
2012-01-01, John
2012-02-01, Ryan
2012-02-01, Mark
2012-02-01, Ryan
2012-02-01, Mark
2012-02-01, Paul
2012-02-01, Kevin
2012-02-01, John
2012-03-01, Ryan
2012-03-01, Gary
2012-03-01, Ryan
2012-03-01, Mark
2012-03-01, Paul
2012-03-01, Kevin
2012-01-01, John

我要做的是按日期对名称进行分组并添加计数和 将此输出到json

{ date: 2012-01-01, ryan: 3, mark: 1, paul: 1, john: 1 },
{ date: 2012-02-01, ryan: 2, mark: 2, paul: 1, john: 1, kevin: 1 },
{ date: 2012-03-01, ryan: 2, mark: 1, paul: 1, john: 1, kevin: 1 }

到目前为止,我有以下代码:

# user controller
 def index
  @users = User.show_data
  render :json
end


# user model

def self.show_data(start = 14.months.ago)
    total_users = users_by_month(start)
    (start.to_date..Date.today).map do |date|
      {
        occurred_at: date,
        total_users[date].name.to_sym: total_users[count],
      }
    end
  end

  def self.users_by_month(start)
    users = where(occurred_at: start.beginning_of_day..Time.zone.now )
    users = users.group("date(occurred_at)")
    users = orders.select("occurred_at, count(name) as user_name")
    users.each_with_object({}) do |user, names|
       names[user.occurred_at.to_date] = user.user_name
    end
  end

大约有200万行,所以它需要是一个可扩展的选项。

提前致谢,

赖安

1 个答案:

答案 0 :(得分:0)

如果您需要更具可扩展性,可能需要创建一个DATE类型列以用于分组,并确保其上有索引。

您可以使用此列代替DATE(occurred_at)进行计算。

请注意,此列应设置为occurred_at回调处理程序中等效before_save的日期。