在铁路中按天/月/年订购查询

时间:2012-12-17 17:42:15

标签: ruby-on-rails ruby postgresql activerecord

让我解释一下我想要做什么,我有一张表Clicks,其中保存了产品的所有点击。我想制作一个图表,说明客户点击了多少次。

此图表需要日,月和年视图。

图表工作所需的是哈希或对象。

我的想法是,我得到了类似的东西:

data( 2012 => [ 01 => 100, 02 => 300, 03 => 50 etc.], 2011 => [ 01 => 100, 02 => 300, 03 => 50 etc.])

如何以这样的顺序从postgresql数据库中检索所有数据?我想获取created_at字段并从那里提取日期。在以后的过程中,必须计算特定月份的所有项目。

我正在努力解决这个问题,有人会把我推向正确的方向吗?

2 个答案:

答案 0 :(得分:3)

您发布的代码段是针对MySQL的 - 在PostgreSQL中也是如此:

@clicks = Click.select("count(*) as c, date_part('year', created_at) as y, date_part('month', created_at) as m").
                group("y", "m").
                where({:user_id => current_user.id})

这将为您提供格式为[year, month] => count的哈希值。要以您想要的格式获得它,您需要稍微调整一下结果:

results = @clicks.inject({}) do |m, kv|
  year, month = kv.first
  clicks = kv.last
  m[year] ||= {}
  m[year][month] = clicks
  m
end

或者更简洁一点:

results = @clicks.each_with_object({}) do |((year, month), clicks), m|
  (m[year] ||= {})[month] = clicks
end

答案 1 :(得分:3)

如果您使用Postgre(或Heroku whit PG)可以这样做:

按月:

Consumer.all.order("extract(month from created_at) DESC")

按日

Consumer.all.order("extract(day from created_at) DESC")

按年度

Consumer.all.order("extract(year from created_at) DESC")