2009-11-23 33 views
0

我有这个方法在控制器:如何使用memcache在控制器中缓存查找?

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使查询每一篇文章被访问时不执行的结果。

那么,我该如何去缓存那个查询呢?我可以从控制器内缓存吗?

CLARIFICATION:我正在寻找缓存这个无限期的时间(直到我决定到期)。我最终将使用memcache来做到这一点。

+0

那不去做呢?无论何时使用@article,都不会有任何查询运行,只会使用您的@article ActiveRecord对象 – nicholaides

+0

在我的文章中添加了说明。我正在寻找缓存这无限期的时间(直到我决定到期)。我最终将使用memcache来做到这一点。 – Shpigford

回答

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 
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不会重新加载对象。

+0

为我的帖子添加了说明。我正在寻找缓存这无限期的时间(直到我决定到期)。我最终将使用memcache来做到这一点。 – Shpigford

+0

结帐教程我放在我的答案,在我看来,这是你要找的东西 – marcgg

0

您不会在控制器中缓存模型对象,而是将它们缓存在模型中。