7

これら 2 つの変数がコントローラーに設定されています。これらをキャッシュして、毎回データベースと通信するのではなく、初回のみ通信するにはどうすればよいですか。

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

3 に答える 3

14

@djlumleyが言ったこと。

一般に、 ActiveSupport::Cache::Storeを構成および使用して、独自のカスタム変数を明示的に保存することもできます。次に、たとえば次のように、キャッシュされた値を取得/設定できます。

@tablenutrients = Rails.cache.fetch("tablenutrients") do 
  Nutrient.find(:all)
end
于 2012-10-04T00:49:09.253 に答える
3

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ガイドをチェックアウトして詳細を確認します。

于 2012-10-04T00:59:48.133 に答える
3

データベースが正しくセットアップされていれば、デフォルトでデータがキャッシュされているはずです。MySQL または postgresql を使用している場合は、キャッシュが使用する RAM の量を変更して、キャッシュ ヒット率を高くすることができます。

単純なデータベース キャッシングを超えて、Dalliのようなものを使用して memcached に接続すると、パフォーマンスをかなり簡単に改善できるはずです。

Rails は memcached を利用して、アクティブなレコード クエリをすべて memcached にキャッシュする必要があります (正しくセットアップされている場合)。キャッシングに関するRails ガイドDalli のドキュメントは、実行している Rails のバージョンに基づいて開始するのに役立ちます。

于 2012-10-04T00:42:55.803 に答える