2009-11-23 35 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

您不會在控制器中緩存模型對象,而是將它們緩存在模型中。