2012-05-22 43 views
3

我的頁面出現問題,需要很長時間才能刷新下拉列表。基本上在更改表單中的一個下拉值時,第二個下拉列表的潛在選項更改爲不同的列表。如何緩存/加速Ruby on Rails中的下拉框數據

如何加快速度?如果可以提供幫助,我正在使用REDIS。

謝謝!

+0

如果你看看'log/development.log',有沒有明顯緩慢的查詢或部分呈現? – tadman

+0

我非常理解這些查詢,我真的很期待緩存或其他方法的信息,當有人在瀏覽器中更改下拉列表時,不需要在服務器上進行數據庫查找。 –

回答

2

如果您有您的主要選擇的幾個選項,那麼你可以設置在陣列中的一個js哈希所有可能的輔助選項,當你第一次渲染頁面,然後在初級的變化,查找與此客戶端JS數組 - 這顯然很快,但如果選項太多,可能會減慢初始頁面加載或膨脹頁面大小。

另一種方式將仍然能夠在主選擇改變一個Ajax調用,但緩存返回第二選項的動作。這將允許它根據請求的參數進行緩存,並儘可能在rails緩存中使用渲染的結果(而不是總是碰到redis或db)。

+0

我正在將所有可能的選項存儲在客戶端散列中。一些下拉菜單有很多選項。這會減慢初始頁面加載速度。一般來說,這是一個很好的建議 - 但是我這樣做了,在這種情況下,它會減慢初始頁面加載的速度。 –

+0

您可以在文件中加載輔助選項,然後使用腳本標記將它們添加到頁面中(該文件甚至可以在瀏覽器以及服務器端緩存)。這應該有助於初始頁面加載,但缺點是您可能必須禁用更改主要選擇,直到加載腳本文件。 –

2

來自Andrew Kuklewicz的很棒回答。要添加到它...

使用Rails的 「Fragment Caching」。

如果你把它發送給客戶端的頁面加載,example.html.erb:

<% cache do %> 
    <script> 
    var javascript_hash = {name: '<%[email protected]_val%>'}; 
    </script> 
<% end %> 

如果你需要緩存的AJAX動作的輸出,example.js.erb:

<% cache do %> 
    alert('hello from javascript'); 
<% end %> 

另外,在你的動作本身中,確保你只是實例化ActiveRecord :: Relation's而不是實際執行查詢:

Company.where({name: 'foo'}) # this 
Company.where({name: 'foo'}).all # not this 
+0

我正在將所有可能的選項存儲在客戶端散列中。一些下拉菜單有很多選項。這會減慢初始頁面加載速度。一般來說,安德魯是一個很好的建議 - 但是我這樣做了,在這種情況下,它減緩了初始頁面負載。 –

+0

我剛剛更新了答案......現在可能更有意義。 – tybro0103

1

低技術方法可能是呈現靜態JSON或JavaScript文件,該文件可由包含輔助下拉內容的客戶端緩存。

最簡單的版本,只是將一些路徑,比如/cache/drop_down.state1.js等等,其中客戶端獲取這些需求。您可以使用Rails頁面緩存系統自動將這些結果保存到/public中,以便後續請求轉到之前創建的同一個JavaScript,從而無需往返數據庫。它們也可以根據需要過期。

您可以爲每個下拉單獨做到這一點,或者如果可行,所有下拉菜單一次,然後包括它並選擇從列表中的相應的鍵。

這要求構建出客戶端腳本來動態創建和填充包括:如果一個應當被預先選擇選擇合適的條目二次下拉字段。不過,使用jQuery等幫助程序庫並不困難。