【问题标题】:Order query by day / month / year in rails在rails中按日/月/年查询订单
【发布时间】:2012-12-17 17:42:15
【问题描述】:

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

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

我需要一个散列或一个对象来运行图表。

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

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

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

我在这个问题上苦苦挣扎,有人能把我推向正确的方向吗?

【问题讨论】:

  • 如果您可以按天保存总点击次数,那么按月和按年检索总点击量就变得微不足道了,因为您只需总结 30、31、365、366 天的总点击次数。
  • 您想简单地描述您的数据库的架构,还是我们应该想象地为字段和表拼凑名称?而且,向我们展示您编写的代码示例如何,这样我们就不会重新发明您的特定轮子?
  • 数据库中的字段是“user_id”、“product_id”、“created_at”、“updated_at”。当没有可显示的内容时,图表将显示 0。我想做的是: Clicks.where('user_id = ?', current_user.id).count .. 这会计算来自该用户的所有点击,但不在一段时间。从stackoverflow的另一个问题,我得到:@clicks = Click.select('count(distinct(id)) as id, year(created_at) as y, month(created_at) as m').group('y, m').where({:user_id => current_user.id}) 但是这一年的中断(created_at)
  • 还尝试了以下方法:@clicks = Click.where({:user_id => current_user.id}).count(:group => "strftime('%m',date")跨度>

标签: ruby-on-rails ruby postgresql activerecord


【解决方案1】:

您发布的 sn-p 是用于 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

【讨论】:

    【解决方案2】:

    如果你使用 Postgree(或 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")
    

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      相关资源
      最近更新 更多