2013-03-27 58 views
1

我想建立一个数组,通过模型的方法是这样的:的Rails 3计数记录的日期

[['3/25/13', 2], ['3/26/13', 1], ['3/27/13', 2]]

其中,日期是字符串,在他们之后的数字是一个企业的count表/对象。

我有以下的模型方法现在:

def self.weekly_count_array 
    counts = count(group: "date(#{table_name}.created_at)", conditions: { created_at: 1.month.ago.to_date..Date.today }, order: "date(#{table_name}.created_at) DESC") 
    (1.week.ago.to_date).upto(Date.today) do |x| 
    counts[x.to_s] ||= 0 
    end 
    counts.sort 
end 

但是,它不能准确地返回计数(所有值都为零)。在我看来,似乎有一些类似的问题,但似乎无法让他们工作。

有人可以帮(1)让我知道这是做的最好的方法,和(2)提供的问题可能与上面的代码是什么方面的一些指导,如果是这样?谢谢!

+0

你得到什么的'counts'变量在方法?该查询是否按照您期望的那样返回值? – 2013-03-27 18:01:04

+0

我正在尝试总计特定日期的记录数。不,“计数”似乎是突破的部分。 – Justin 2013-03-27 18:10:45

+0

对不起,误解了这个问题。上面的方法根据格式返回适当的数组,但对于所有对象计数都具有0,即使对象存在几天。 – Justin 2013-03-27 18:29:48

回答

7

以此为模板,如果你想

def self.period_count_array(from = (Date.today-1.month).beginning_of_day,to = Date.today.end_of_day) 
    where(created_at: from..to).group('date(created_at)').count 
end 

这将返回的日期为键和算作值的哈希。 (Rails的3.2.x中)由@Aditya Sanghi的

+0

这是我的代码上面的问题 - 我推出'Date.today'而不指定'end_of_day'。因此,该对象今天没有显示。所以,我的问题中的代码起作用,这只是一个添加的问题,但这确实是一个更加优雅的散列解决方案。谢谢! – Justin 2013-03-27 18:48:02

0

你并不需要一个过程来进行计数。只需为此执行查询。

def self.weekly_count_array 
    select("created_at, COUNT(created_at) AS count") 
    where(created_at: 1.month.ago.to_date..Date.today) 
    group("created_at") 
    order("created_at DESC") 
end 
+0

虽然我想将计数放入一个数组,但日期是另一个组件。没有这个过程,就没有零。 – Justin 2013-03-27 18:12:01

+0

好您可以创建的所有日期和计数器零的数组,只是做查询返回的日期和计数器合并。 – 2013-03-27 18:15:10

+0

你将不得不向我展示你的意思。上面发布的方法只是将对象放入数组中而不列出所有日期。我希望有一个数组,像方法返回的原始问题中的数组,每天的日期和计数,以及没有计数的天数为零。 – Justin 2013-03-27 18:27:43

1

也许这就是你想要做的?

class YourActiveRecordModel < ActiveRecord::Base 

    def.self weekly_count_array 
    records = self.select("COUNT(id) AS record_count, DATE(created_at) AS created") 
     .group("DATE(created_at)") 
     .where("created_at >= ?", 1.month.ago.to_date) 
     .where("created_at <= ?", Date.current) 

    records.each do |x| 
     puts x.record_count 
     puts x.created # 2013-03-14 

     # use I18n.localize(x.created, format: :your_format) 
     # where :your_format is defined in config/locales/en.yml (or other .yml) 
    end   
    end 
end 
1

意想不到的答案。

如果你有确切的要求,你可以选择:

def self.weekly_count_array 
    records = select('DATE(created_at) created_at, count(id) as id').group('created_at') 
    1.week.ago.to_date.upto(Date.today).map do |d| 
    [d, records.where('DATE(created_at) = ?', d.to_date).first.try(:id) || 0] 
    end 
end 
0

建立在@kiddorails答案,

,这样不会让大量的请求到数据库,从ActiveRecord的创建一个哈希

&改变了组从。集团( 'created_at')到。集团( 'DATE(created_at)'),以将它基于日期

def self.weekly_count_array 
    # records = select('DATE(created_at) created_at, count(id) as id').group('created_at') 
    records_hash = Hash[Download.select('DATE(created_at) created_at, count(id) as id').group('DATE(created_at)').map{|d|[d.created_at, d.id] }] 
    1.month.ago.to_date.upto(Date.today).map do |d| 
    [ d, records_hash[d.to_date] || 0 ] 
    end 
end