我主要是用來寫東西普通的SQL,但我想了解AREL更好。基本上我能做些什麼來計算一個:include的內容。Rails Arel,計算包含的值?
Category.includes(:discussions)
那是我包括然後討論has_many評論。我需要知道如何計算類別模型的評論。
很抱歉,如果這是公然明顯和感謝提前任何幫助!
編輯:更新了數類別上不討論。
我主要是用來寫東西普通的SQL,但我想了解AREL更好。基本上我能做些什麼來計算一個:include的內容。Rails Arel,計算包含的值?
Category.includes(:discussions)
那是我包括然後討論has_many評論。我需要知道如何計算類別模型的評論。
很抱歉,如果這是公然明顯和感謝提前任何幫助!
編輯:更新了數類別上不討論。
我遠離阿雷爾專家,但我的直覺,因爲你必須得到至少一點點手動在您的計算。這裏是你如何能得到每個類別的計數使最大使用AREL的:
Category.joins(:discussions => :comments).group('categories.id').select('categories.id, COUNT(*) as cnt')
注意,你不會有加載類的完整的模型,但我認爲這是得到充分的最快方法計數列表。我不確定你可以採用哪些其他方法,但我認爲這是最快的查詢。根據您的特定應用程序,您可能想要做些改變。
謝謝您的輸入,我也會試一試。很難找到這樣做的'最好'的方式! – 2011-05-29 15:47:31
一般情況下,你可以使用任何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?
你能對你的模型詳細說明好嗎?是類別has_many討論has_many評論?你想獲得一個類別的評論總數? – Jits 2011-05-29 13:52:10