我怎样才能转换这个group_by语句,以便它可以在DB而不是Ruby上运行?

时间:2013-09-22 15:10:15

标签: mysql sql ruby-on-rails ruby postgresql

我正在建立一个网站的年度存档,我让它工作,但我正在使用group_by。这个特定的网站最终将有数千个帖子,我想将分组移动到数据库,但我不确定如何将其转换为活动记录查询。

我正在使用活动记录和rails 4,这是我到目前为止所拥有的:

在控制器中:

@posts_by_year = @posts.group_by { |post| post.published_at.year }

在视图中:

  <% @posts_by_year.each do |year, post| %>
    <li><%= "#{year} - #{pluralize post.count, 'post'}" %></li>
  <% end %> 

生成如下所示的列表:

2013 (5 posts)
2012 (2 posts)
2010 (1 post)

我如何复制这个确切的功能,但让数据库进行分组,如果您希望每年有2,000-3,000个帖子,您认为值得进行转换吗?最后,如果我使用mysql或postgres,活动记录的实现会有所不同吗?

2 个答案:

答案 0 :(得分:1)

在控制器中(假设您正在使用mysql的标签)

@posts_by_year = @posts.select("YEAR(published_at) AS year, COUNT(id) AS counter").group("YEAR(published_at)")

在视图中

<% @posts_by_year.each do |post| %>
  <li><%= "#{post.year} - #{pluralize post.counter, 'post'}" %></li>
<% end %>

答案 1 :(得分:0)

您需要使用函数来获取年份,这取决于您的数据库;例如,对于PostgreSQL,您可以使用EXTRACT

Post.group('extract(year from published_at)').count
# => { 2013 => 5, 2012 => 2, 2012 => 1 }