2011-08-02 79 views
3

我期待對選擇文章的出現次數進行分組,排序和統計。我選擇我的組文章如下:如何統計對象中字符串的出現次數

@articles = Article.find(:all, :where("distance < ?", specified_distance))

這裏了,我想分組,排序和計數是列入@articles(不是所有文章)文章標題爲在視圖中使用(如下):

New York Yankees (3 Articles) 
Boston Red Sox (1 Article) 
Chicago Cubs (8 Articles) 

這不是通過使用多對多,它嚴格的字符串比較,分組,計數。我不知道如何去做。有沒有在Rails中做這個的標準做法?

這類似於該用戶要求,但略有不同:

rails sorting blog posts by title

編輯/

我必須使用@articles只(和上面顯示的不是物理查詢),因爲查詢通常會發生變化,而且要複雜得多。所以,我的解決方案必須參考/從@articles

回答

1

在模型:

scope :articles_up_to, lambda { |distance| where("distance < ?", distance) } 

scope :article_counts_up_to, lambda { |distance| 
    articles_up_to(distance) 
    .select("COUNT(*) AS count, title") 
    .group("title") 
    .order("count DESC") 
} 

在控制器:

@article_counts = Article.article_counts_up_to(specified_distance) 

編輯: 本文就範圍可能會有所幫助:http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html

+0

我應該規定,我必須使用'@ articles'只是因爲查詢經常會發生變化,而且比這更復雜。 – Lisa

+0

我會將複雜查詢表示爲範圍,然後將其與該範圍相鏈接。 – jdc

+0

是什麼? (我編輯了我的答案) –

1

好吧,我知道你想使用@articles,所以簡單地說,這裏有一個(真的很亂)的解決方案,不涉及改變模型,或者構建新的SQL查詢:

@article_counts = @articles 
    .group_by(&:title) 
    .map { |a| {:title => a[0], :count => a[1].size} } 
    .sort { |a1,a2| a2[:count] <=> a1[:count] } 
+0

謝謝你了:) – Lisa

相關問題