我可能在这里遗漏了一些非常简单的东西,但却无法理解。
我正在尝试缓存一个简单的活动记录查询,但每次触摸缓存时,它都会再次对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的激活记录调用。
我错过了什么?
答案 0 :(得分:6)
该行
products = Product.where('name LIKE ?", 'product_name?')
返回ActiveRecord::Relation
,但不命中数据库,除非在其上调用了kicker方法。
虽然我仍然建议使用上面评论中提到的fetch
,但请尝试将该行更改为:
products = Product.where('name LIKE ?", 'product_name?').all
将强制数据库命中,并将查询的实际结果保存到缓存中,而不是关系。