2013-02-17 60 views
1

我創建了一個循環來計算記錄的總評分。爲此,我首先循環所有子記錄(評級),從每行中提取評分,將其添加到總數中,然後輸出總數。Rails循環重構

<% total = 0 %> 
<% for ratings in @post.ratings %> 
    <% total = (total + ratings.rating) %> 
<% end %> 
<%= total %> 

我的問題是,簡單地說,這是Rails的方式?

它達到了預期的效果,雖然需要5行來完成。我擔心我將其他語言的舊習慣帶入我的rails項目,我希望有人能夠澄清是否有更簡單的方法。

回答

3

下,PR eferably控制器,會做簡明扼要:如果這看起來神祕

@rating = @post.ratings.sum { &:rating } 

,你可能更喜歡

@rating = @post.ratings.inject(0) { |sum, p| sum + p.rating } 

但是請注意,這將會如有的收視率是零,未能所以你可能想要:

@rating = @post.ratings.inject(0) { |sum, p| sum + (p.rating || 0) } 
+0

不錯,我每次都會學到新的東西,所以我來這裏:) – 2013-02-17 07:26:32

+0

非常好,謝謝。 – Asciant 2013-02-17 07:33:20

+0

您可以顯式轉換評分to_i以避免||運營商。但無論如何 - 第一個例子是您應該接受的唯一例子 - 它將db查詢的計數減少到1並提高性能。 – 907th 2013-02-17 09:01:56

1

您通常應該將邏輯放在視圖之外。我把這些代碼在一個輔助或控制器,並調用一個方法來計算總

0

把下面的在你的控制器,那麼你只需要在視圖中使用@rating

total = 0 
@rating = @post.ratings.each { |r| total += r.rating } 

或者你可以將它移動到Post模型並做類似:

def self.total_rating 
    total = 0 
    ratings.each { |r| total += r.rating } 
    total 
end 

,然後只需撥打@post.total_rating