2012-12-25 69 views
1

我有一個觀點,我打電話school.html.erb,在這個視圖中,我有Ruby代碼來計算該學校的平均評分。我應該在模型,輔助器還是控制器中放置它?

像這樣:

<span class="label label-info"> 
<%= @school.reviews.average(:rating).round(1) unless @school.reviews.blank? %> 
</span> 

我喜歡別人動這個地方,我應該把這個模型中,一個輔助或控制器。如果我這樣做,我怎麼能從視圖中調用它。

我有以下型號:User,ReviewSchool

回答

2

計算平均所屬的模型:

class School < ActiveRecord::Base 

    ... 

    def average_review_rating 
    return nil if reviews.blank? 
    reviews.average(:rating) 
    end 

end 

四捨五入在視圖中平均所屬的,因爲它被格式化。將計算放入模型中,並在視圖(或助手)中進行格式化。

<%= @school.average_review_rating.round(1) if @school.average_review_rating %> 

這可以使用andand寶石大大縮短。

<%= @school.average_review_rating.andand.round(1) %> 

你不妨推四捨五入到幫助,它可以進行獨立測試:這是用來這樣

class SchoolHelper 

    def format_rating(n) 
    n.andand.round(1) 
    end 

end 

<%= format_rating(@school.average_review_rating) %> 
1

我覺得我把它作爲一種方法放在模型中有很多意義。

class School 
    def avg_rating 
    reviews.average(:rating).round(1) unless reviews.blank? 
    end 
end 

爲什麼它有道理?那麼,學校評分是您可能必須在其他許多地方訪問的內容:其他視圖,其他模型等。通過將它放入方法中,您可能看起來只是School的一個屬性。 school.avg_rating幾乎是自言自語:「學校,你的評價是什麼?」

爲什麼瀏覽不行?您可能想要在其他視圖中訪問它。有幫助者,對嗎?但爲什麼助手不會這樣做?您可能還想從其他模型訪問它。幫手不是要計算數據,而是要格式化和做其他類似的事情。

0

模型(學校)放入:

def reviews_average 
    reviews.average(:rating).round(1) unless reviews.blank? 
end 

查看:

<%= @school.reviews_average %> 

原因:不要把DB密集型程序到視圖,因爲渲染速度取決於它。

+0

您確定將查詢移入模型會帶來性能好處嗎?在我看來,無論哪種方式都需要相同的時間。 –

+0

我也這麼認爲。爲了證明它只是試圖在視圖內運行某些東西並查看時間響應。大多數情況下,差異是不可察覺的,但它是。 –

相關問題