我正在尝试设置基本日历功能,该功能将显示指定日期内发布的文章数量。因此,我需要一个查询,从我的表中提供当天的日期和计数。现在我正在这样做:
ActiveRecord::Base.connection.execute("SELECT COUNT(*), DATE(created_at) FROM 'articles' GROUP BY DATE(created_at)")
返回类似的内容:
[{"COUNT(*)"=>1, "DATE(created_at)"=>"2011-05-09", 0=>1, 1=>"2011-05-09"
{"COUNT(*)"=>2, "DATE(created_at)"=>"2011-05-12", 0=>2, 1=>"2011-05-12"},
{"COUNT(*)"=>2, "DATE(created_at)"=>"2011-05-13", 0=>2, 1=>"2011-05-13"},
... etc.
然而,这似乎是一种非常糟糕的方式来做这件事。我也希望能够将其与我设置的其他示波器联系起来,以便我可以做类似的事情:
Article.no_spam.date_counts
并得到类似的结果。是否有更多的Rails-y方式来做到这一点?我正在使用Rails 3。
编辑:没有人回答,我找到了一个丑陋但可行的解决方案,以防万一将来需要它。但是,如果有更好的方法,请告诉我: 这是我的代码(在Article.rb中):
def self.datecount
#this query is a mega hack, but it alows me to chain Article scopes nicely
counts = select("COUNT(created_at) as id, created_at").group("DATE(created_at)")
out = {}
counts.each do |a|
out[a.created_at.to_date] = a.id
end
out
end
这允许我链接我的范围我想要的Article.no_spam.datecount返回{dates =>的哈希值计数},我也可以在堆栈上添加其他范围。内心真是太丑了......
答案 0 :(得分:0)
如果你这样做
Article.group('DATE(created_at)').count
您将获得created_at
日期的哈希值,以及count
在该日期创建的文章。
答案 1 :(得分:-1)
self.datecount
的更好方法是
out = counts.group_by(&:created_at)
或
out = counts.map{|a| [a.created_at.to_date, a.id] }.group_by(&:first)