2009-08-06 96 views
4

我有一個包含date_published的Post模型。我想在索引頁面上顯示鏈接以查看某年的所有帖子(有點像博客有幾個月可以查看)Rails group by year問題

我能想到的迴歸多年的唯一方法是迭代遍歷所有的職位,並返回了職位所在年份的獨特陣容。但這似乎很漫長。有沒有人有更好的解決方案?也許這會更容易,只是創建新的表,所以一個職位belongs_to:年

任何建議?

回答

4

我會使用其中的一個:

  • 一個find_by_sql得到不同的年,使用任何一年,揭示功能是在你的數據庫中。可能會根據我預期會有的索引來解決;

  • Post.minimum(:date_published).year..Post.maximum(:date_published).year

我喜歡第二個了很多,即使它不佔,一年可能沒有職位的可能性!

+0

是的,我想到你的第二個選擇很多。仍在思考如果那是最好的事情。謝謝 – Cameron 2009-08-06 15:27:26

3

使用SQL搜索的日期時間字段的(在我的例子是的updated_at)

years = ActiveRecord::Base.connection.select_all("SELECT DISTINCT DATE_FORMAT(updated_at, '%Y') AS updated_at FROM posts ORDER BY updated_at DESC") 

這將在形式返回所有的年份值

[{"updated_at"=>"2009"}, {"updated_at"=>"2008"}, {"updated_at"=>"1979"}, {"updated_at"=>"1922"}] 

years.each { |y| puts y['updated_at'] } 
2009 
2008 
1979 
1924 
9

你不必在你的Ruby代碼中遍歷它們。您可以使用:group選項與count

>> Post.count(:all, :group => "Year(date_published)") 
=> [["2005", 5], ["2006", 231], ["2007", 810], ["2009", 3]] 

,然後建立從該鏈接。

+0

這很酷。可能會嘗試。 – Cameron 2009-08-06 15:35:10

+0

對於SQLlite,語法爲'Post.count(:all,:group =>「strftime('%Y',date_published)」)''。不幸的是,這不適用於MySQL。 – berkes 2012-03-13 20:24:55