我在控制器中有这个方法:
def article_info
if @article = Article.find_by_permalink(params[:permalink])
@title = @article.title
@description = @article.excerpt
@body = @article.body
else
render_404
end
end
我最终想要缓存Article.find_by_permalink
的结果,以便每次访问文章时都不会执行查询。
那么,我该如何缓存该查询呢?我可以从控制器中缓存吗?
澄清:我希望无限期地缓存它(直到我决定使它过期)。我最终会使用memcache来做到这一点。
答案 0 :(得分:0)
你查过日志了吗?通常rails本身就可以很好地缓存事物。
缓存数据库调用如下所示:
**CACHE (0.0ms)** SELECT * FROM `funnels` WHERE bla bla
如果不满足您,请尝试查看this tutorial on rails envy。
当然,如果你这样做......
@article = Article.find_by_permalink(params[:permalink])
@title = @article.title
@description = @article.excerpt
@body = @article.body
...只进行了1次数据库查询。调用@article不会重新加载对象。
答案 1 :(得分:0)
答案 2 :(得分:0)
您不会在控制器中缓存模型对象,而是将它们缓存在模型中。
答案 3 :(得分:0)
您可以按照here描述的模型在模型中定义新方法:
# models/article.rb
def self.all_cached
Rails.cache.fetch('Article.all') { all }
end
然后,如果结果被缓存,则对Article.all_cached
的调用将不会查询数据库。否则它会从数据库中获取结果。
更新:您的find_by_permalink
来电可以替换为cached_find_by_permalink
:
# models/article.rb
def self.cached_find_by_permalink(permalink)
Rails.cache.fetch('Article.find_by_permalink.' + permalink) do
find_by_permalink(permalink)
end
end