2011-05-29 70 views
1

我主要是用來寫東西普通的SQL,但我想了解AREL更好。基本上我能做些什麼來計算一個:include的內容。Rails Arel,計算包含的值?

Category.includes(:discussions) 

那是我包括然後討論has_many評論。我需要知道如何計算類別模型的評論。

很抱歉,如果這是公然明顯和感謝提前任何幫助!

編輯:更新了數類別上不討論。

+1

你能對你的模型詳細說明好嗎?是類別has_many討論has_many評論?你想獲得一個類別的評論總數? – Jits 2011-05-29 13:52:10

回答

1

我遠離阿雷爾專家,但我的直覺,因爲你必須得到至少一點點手動在您的計算。這裏是你如何能得到每個類別的計數使最大使用AREL的:

Category.joins(:discussions => :comments).group('categories.id').select('categories.id, COUNT(*) as cnt') 

注意,你不會有加載類的完整的模型,但我認爲這是得到充分的最快方法計數列表。我不確定你可以採用哪些其他方法,但我認爲這是最快的查詢。根據您的特定應用程序,您可能想要做些改變。

+0

謝謝您的輸入,我也會試一試。很難找到這樣做的'最好'的方式! – 2011-05-29 15:47:31

0

一般情況下,你可以使用任何has_many協會#count方法來獲取計數。例如:

Category.find(1, :include => :discussions).discussions.first.comments.count 

編輯:

A 「蠻力」 的方法在一個特定的類別計算所有評論:

category = Category.find(1, :include => { :discussions => :comments }) # Check that this eager loading doesn't cause unnecessary overhead. 
count = 0 
category.discussions.map{|d| count += d.comments.count} 

注意,這將創建N + 1個查詢,因此可能不是一個表演選項。另一種方法是設置在討論模型counter cache column,然後執行這個代替:

category = Category.find(1, :include => :discussions) 
count = 0 
category.discussions.map{|d| count += d.comments_count} 

編輯(2):

可以進一步通過使用Array#inject方法簡化的總和位。看到這裏的例子:How to sum array of numbers in Ruby?

+0

對不起那將是從我最初解釋是正確的,我想要做的是計算類的評論在一個整體,不只是第一次討論。 – 2011-05-29 14:04:45

+0

這個問題並不清楚。你問:「我需要知道如何計算討論模型的評論。」因此,我對澄清問題本身發表了評論。 – Jits 2011-05-29 14:07:36

+0

我已經更新瞭解決此問題的答案。 – Jits 2011-05-29 14:13:17