0

我可能在这里遗漏了一些非常简单的东西,但不明白是什么。

我正在尝试缓存一个简单的活动记录查询,但每次我触摸缓存时,它都会再次对数据库运行查询。

控制器代码:

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 块而不是 else,但是任何时候我试图触摸产品(比如渲染它),我也会看到对数据库的活动记录调用。

我错过了什么?

4

1 回答 1

6

线

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

返回一个ActiveRecord::Relation,但除非调用了 kicker 方法,否则不会访问数据库。

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

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

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

于 2012-07-30T02:33:54.147 回答