2012-12-27 60 views
1

在Rails中,我們通常會遇到一些從Views(甚至幫助程序)中觸發一些查詢的情況。例如,如果我想在我的頁面中添加一個選擇框,我會寫一些像;在rails視圖中查詢對性能的影響

<%= collection_select(:person, :city_id, City.all, :id, :name) %> 

本示例從Rails指南中獲取。在這裏我們使用了「City.all」而不是一個實例變量。我的問題是,這會對我的應用程序的性能產生什麼影響嗎?

下面是做同樣事情的更好方法嗎?爲什麼?
在控制器:

@cities = City.all 

然後在訪問量:

<%= collection_select(:person, :city_id, @cities, :id, :name) %> 

回答

1

它將對應用程序本身沒有特殊的影響,無論是它的一個視圖或控制器,因爲該系統它也是一樣的 - >發出一個查詢。但是,這種做法根本沒有鼓勵,那麼代碼隔離和模塊化的整個概念就是一種折騰。

由於這個原因,我建議在視圖的查詢中使用實例變量。

1

實際上有區別,有時是必不可少的。渲染速度(響應時間)主要取決於注入的密集查詢。解釋爲什麼會發生這種情況可能是單調乏味的,但只要遵循規則就容易了:以這種方式設計應用程序,ActionView可以在其中準備(載入內存)對象。

我認爲ActionView是Rails的一大瓶頸(尤其是ERB編譯)。

+0

你可以試着解釋爲什麼是這樣嗎? – Vignesh

+0

只要請求發送,ActionView實例就會立即初始化。方法執行時,所有變量都會同時初始化。因此運行時有一個經濟。但是如果內部視圖模板有些沉重,所有的操作都是一致的,渲染花費更多的時間來生成響應體。我用幾次重大的查詢來測試它幾次,並且響應時間的差異是顯而易見的(減慢2-3倍)。 –