2009-08-06 71 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