2012-10-04 204 views
4

我在控制器中設置了這兩個變量。我如何緩存這些數據,以便它們不會每次都只與第一次與數據庫通信。Ruby on Rails - 緩存變量

@tablenutrients = Nutrient.find(:all) 
@columnnutrients = @tablenutrients.collect {|x| x.nutrient} 

回答

10

@djlumley說什麼。

通常,您還可以配置和使用ActiveSupport::Cache::Store來顯式存儲您自己的自定義變量。然後,您可以獲取/設置緩存的值,例如,像這樣:

@tablenutrients = Rails.cache.fetch("tablenutrients") do 
    Nutrient.find(:all) 
end 
+0

感謝您的回答 –

3

如果你的數據庫設置正確,它應該默認緩存你的數據。如果您使用的是MySQL或postgresql,則可以更改緩存使用的RAM數量,以確保獲得高緩存命中率。

除了簡單的數據庫緩存之外,使用類似Dalli連接到memcached應​​該使改進性能相當容易。

Rails應該利用memcached緩存memcached中的所有活動記錄查詢,只要它正確設置即可。 Rails guide on caching加上Dalli documentation應該可以幫助您根據您運行的Rails版本開始工作。

+0

感謝您的意見。我會仔細看看的。 –

2

Rails有內置在你的緩存選項,其中兩個會爲你這取決於你用什麼做的工作可能,幾查詢結果:

片段緩存

如果您正在使用這個作爲一個選擇框經常使用的形式,我會用這個選項去收集。這將允許您不僅緩存數據庫結果,而且緩存頁面的實際HTML部分。這是通過拋出一個<%= cache do %>周圍的部分簡單地完成,就像這樣:

<html> 
    ... 
    <body> 
    ... 
    <div class='content'> 
     ... 
     <%= cache do %> 
     <%= select "nutrient", "nutrient", Nutrient.all.collect(&:nutrient) } %> 
     <% end %> 

Rail.cache

你也可以寫一個方法通過降低一個直接對話的內置緩存存儲,,然後在ApplicationController的方法有它的一個的before_filter回調運行,像這樣:

application_controller.rb

class ApplicationController < ActionController::Base 
    before_filter :retrieve_nutrients 

    def retrieve_nutrients 
    @nutrients = Rails.cache.fetch("nutrients") do 
     Nutrient.all.collect(&:nutrient) 
    end 
    end 
end 

在生產環境中這兩種情況下,你會想設置任何的Memcached或Redis的作爲一個緩存層(他們坐在後面Rails.cache並實施SNAP)。我會結賬Rails Guides以深入瞭解它。

+0

感謝您的信息我欣賞它 –