在 controller 里
Rails.cache.fetch("posts", :expires_in => 30.minutes) {
@posts = Post.joins(:user).where('users.email = ?' ,email)
}
render :json => @posts
由于@posts 比较频繁的被调用 (这个是一个 API),所以我想使用缓存,不知道这样有没有作用. 如果把 render :json => @posts 放到里边,是不是会有作用?以下是代码:
Rails.cache.fetch("posts", :expires_in => 30.minutes) {
@posts = Post.joins(:user).where('users.email = ?' ,email)
render :json => @posts
}
求大牛们指教。
明显可以啊,不过你用法不对
@posts = Rails.cache.fetch("posts", :expires_in => 30.minutes) {
Post.joins(:user).where('users.email = ?' ,email)
}
render :json => @posts
我晕还要传参数啊,参数要放入 cache_key
@posts = Rails.cache.fetch("posts:#{email}", :expires_in => 30.minutes) do
Post.joins(:user).where('users.email = ?' ,email)
end
render :json => @posts
不能这样用。fetch 有缓存的时候 block 里的代码不执行,无缓存的时候返回并缓存 block 的返回值,所以无论那种情况都返回不了正确的值。
#3 楼 @hlcfan http://guides.rubyonrails.org/layouts_and_rendering.html#using-render 你先了解下 render 是什么吧
补充一下
一般来说 json 接口不会直接用 to_json,因为输出的信息太多,这时可以用 Jbuilder https://github.com/rails/jbuilder 来定制 json 数据。Jbuilder 可以用视图的 helper。
我觉得缓存设在 View 比较好,AR 是延迟查询的,不会重复查询。(可能别人有不同见解)
#21 楼 @hlcfan view 里面的 cache 指 Fragment Cache,是粒度小比较灵活的 cache。Page cache 是框架内粒度最大的 cache,没有走过滤器和控制器。
可以抽时间看一下 http://guides.rubyonrails.org/caching_with_rails.html