0

ここで非常に単純なものが欠けている可能性がありますが、何が理解できません。

単純なアクティブ レコード クエリをキャッシュしようとしていますが、キャッシュにアクセスするたびに、DB に対してクエリが再度実行されます。

コントローラーコード:

products = Rails.cache.read("search_results")
if products
    render :text => products[0].id
else
    products = Product.where('name LIKE ?", 'product_name?')
    Rails.cache.write("search_results", products)
end

2 番目の呼び出しでは、else ブロックではなく if ブロックに到達することがわかりますが、製品に触れようとすると (レンダリングなど)、DB へのアクティブなレコード呼び出しも表示されます。

私は何が欠けていますか?

4

1 に答える 1

6

この線

products = Product.where('name LIKE ?", 'product_name?')

を返しますが、キッカー メソッドが呼び出されない限り、データベースにヒットActiveRecord::Relationしません。

fetch上記のコメントで述べたように使用することをお勧めしますが、行を次のように変更してみてください。

products = Product.where('name LIKE ?", 'product_name?').all

これにより、データベース ヒットが強制され、リレーションの代わりにクエリの実際の結果がキャッシュに保存されます。

于 2012-07-30T02:33:54.147 に答える