これら 2 つの変数がコントローラーに設定されています。これらをキャッシュして、毎回データベースと通信するのではなく、初回のみ通信するにはどうすればよいですか。
@tablenutrients = Nutrient.find(:all)
@columnnutrients = @tablenutrients.collect {|x| x.nutrient}
これら 2 つの変数がコントローラーに設定されています。これらをキャッシュして、毎回データベースと通信するのではなく、初回のみ通信するにはどうすればよいですか。
@tablenutrients = Nutrient.find(:all)
@columnnutrients = @tablenutrients.collect {|x| x.nutrient}
@djlumleyが言ったこと。
一般に、 ActiveSupport::Cache::Storeを構成および使用して、独自のカスタム変数を明示的に保存することもできます。次に、たとえば次のように、キャッシュされた値を取得/設定できます。
@tablenutrients = Rails.cache.fetch("tablenutrients") do
Nutrient.find(:all)
end
Railsにはいくつかのキャッシュオプションが組み込まれていますが、クエリ結果で何をしているかによっては、そのうちの2つが機能する可能性があります。
フラグメントキャッシング
これを選択ボックスのコレクションとして使用している場合、よく使用されるフォームはこのオプションを使用します。これにより、データベースの結果だけでなく、ページの実際の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の背後にあり、簡単に実装できます)。Railsガイドをチェックアウトして詳細を確認します。
データベースが正しくセットアップされていれば、デフォルトでデータがキャッシュされているはずです。MySQL または postgresql を使用している場合は、キャッシュが使用する RAM の量を変更して、キャッシュ ヒット率を高くすることができます。
単純なデータベース キャッシングを超えて、Dalliのようなものを使用して memcached に接続すると、パフォーマンスをかなり簡単に改善できるはずです。
Rails は memcached を利用して、アクティブなレコード クエリをすべて memcached にキャッシュする必要があります (正しくセットアップされている場合)。キャッシングに関するRails ガイドとDalli のドキュメントは、実行している Rails のバージョンに基づいて開始するのに役立ちます。