Rails在给定的日期范围内按月迭代

时间:2013-07-11 03:20:58

标签: ruby-on-rails ruby charts railscasts morris.js

我试图关注此Railscast并为我的查询模型创建一个morris.js折线图。

我已使用date_trunc将计数分组为几个月,但现在我不太确定如何让X轴迭代数月(例如2012年6月,2013年7月)与铁路广播说明中的日期相反。

我已经尝试了范围#step method here,但现在图表只显示了一个没有计数的日期(2012-07-01),没有别的。从范围变量中注释掉.step(1.month)方法,图表工作正常,但x轴按日期迭代。

class Enquiry < ActiveRecord::Base      

def self.chart_data(start = 1.year.ago)
    total_count = total_count_by_month(start)
    start = start.to_date.beginning_of_month
    today = Date.today.beginning_of_month
    range = (start..today).step(1.month)

      range.map do |month|
        {
          created_at: month,
          total_enquiries: total_count[] || 0
      }
    end
  end

  def self.total_count_by_month(start)
    enquiries = unscoped.where(created_at: start.beginning_of_month..Time.now)
    enquiries = enquiries.group("date_trunc('month', created_at)")
    enquiries = enquiries.select("date_trunc('month', created_at) as created_at, count(*) as count")
    enquiries.each_with_object({}) do |enquiry, counts|
      counts[enquiry.created_at.to_date] = enquiry.count
    end
  end
end

如何让图表的x轴按月(2013年6月,2013年7月......)而不是按日期进行迭代?

1 个答案:

答案 0 :(得分:2)

对于遇到同样问题的其他人,解决方案概述如下:

def self.chart_data(start = 1.year.ago)
    total_count = total_count_by_month(start)

    ##############################################
    start = start.to_date.beginning_of_month
    today = Date.today.beginning_of_month
    range = (start..today).select {|d| d.day == 1}
    ##############################################

    range.map do |month|
        {
          created_at: month,
          total_enquiries: total_count[] || 0
      }
    end
  end

图表的x轴现在按月迭代。

找到解决方案here

我仍在寻找图表日期可能显示的解决方案(%b%Y),而不是当前格式(yyyy-mm-dd)。