2011-05-23 22 views
0

我想設置一個基本的日曆功能,將顯示一個給定的一天張貼的文章數量。因此,我需要一個查詢,從我的表中提供當天的日期和計數。現在我這樣做:更好的方式來做自定義Rails查詢

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 => counts}的哈希,我也可以在棧上添加其他範圍。這只是這麼難看裏面...

回答

0

如果你

Article.group('DATE(created_at)').count 

你會得到created_at日期的散列以count S的在該日期創建的文章。

+0

是啊,謝謝,我只是想通了這一點,WAAAAAY更簡單的方式。 – NateTheBookie 2011-05-24 00:56:33

+0

在我看來,這是一種不直觀的語法,因爲你期望count返回一個int,但它效果很好! – andrewmitchell 2011-05-24 00:59:19

-1

更好地爲self.datecount方式是

out = counts.group_by(&:created_at) 

out = counts.map{|a| [a.created_at.to_date, a.id] }.group_by(&:first) 
相關問題