在rails中查询缓存仍然会对DB进行调用

时间:2012-07-30 02:19:09

标签: ruby-on-rails ruby caching activerecord

我可能在这里遗漏了一些非常简单的东西,但却无法理解。

我正在尝试缓存一个简单的活动记录查询,但每次触摸缓存时,它都会再次对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

我可以看到,在我的第二个电话中,我到达了if块,而不是其他,但是每当我试图触摸产品(比如渲染它)时,我也会看到对DB的激活记录调用。

我错过了什么?

1 个答案:

答案 0 :(得分:6)

该行

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

返回ActiveRecord::Relation,但命中数据库,除非在其上调用了kicker方法。

虽然我仍然建议使用上面评论中提到的fetch,但请尝试将该行更改为:

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

将强制数据库命中,并将查询的实际结果保存到缓存中,而不是关系。