2013-09-22 24 views
0

我正在建立一個站點的年度存檔,我讓它工作,但我正在使用group_by。這個特定的網站最終會有成千上萬的帖子,我想將分組移到數據庫,但我不確定如何將其轉換爲活動記錄查詢。我該如何轉換這個group_by語句,以便它可以在數據庫而不是Ruby上運行?

我使用活動記錄和軌道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) 

我怎麼能複製這一確切的功能,但有DB做分組,而不是和你認爲這是值得的開關,如果你希望每年有2000-3000的帖子?最後,如果我使用mysql或postgres,活動記錄的實現會不同嗎?

回答

0

你需要使用一個函數來獲得年份,它將取決於你的DB;例如,對PostgreSQL,你可以使用EXTRACT

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

如何比較:group(「DATE_TRUNC('year',published_at)」)。count? – AntelopeSalad

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 %> 
+0

我對mysql或postgres未定。我只是在開發模式下使用sqlite。從它的外觀我猜每個實現將有所不同,這取決於數據庫。 – AntelopeSalad

+0

@AntelopeSalad你應該在每個你不想得到意外的環境中使用相同的數據庫系統。 –

+0

@IsmaelAbreu是的,一旦我找出我打算使用哪一個,我就會轉向任何一個。我不認爲我會在項目的早期就碰到數據庫特定的問題。 – AntelopeSalad

相關問題