更好的方法来做自定义Rails查询

时间:2011-05-23 22:38:06

标签: sql ruby-on-rails-3 activerecord

我正在尝试设置基本日历功能,该功能将显示指定日期内发布的文章数量。因此,我需要一个查询,从我的表中提供当天的日期和计数。现在我正在这样做:

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 =>的哈希值计数},我也可以在堆栈上添加其他范围。内心真是太丑了......

2 个答案:

答案 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)