`
hideto
  • 浏览: 2683034 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Rails宝典之第一式: 实例变量做查询缓存?

    博客分类:
  • Ruby
阅读更多
前段时间对Rails的跟进有点懈怠,因为公司让我做Spring的内部培训,便抽空回归Java,看了下字符集,字节码,Annotation,
JavaConfig,JavaScript,Perl,花生壳等等乱七八糟的东西,差点把心收不回来准备去搞C#.net了。

每天一剂Rails良药要开工了,顺便把《The Ruby Way》eMule下来了,再写个“每天一条Ruby小道”怎么样?

前段时间订阅了很多外国网站的rss,发现Railscasts还是比较有趣的一个Rails技术教学网站,里面已经发布了
60多个教学视频,我想把这些教学拿到每天一剂Rails良药里来是不错的选择。
另外为了让本系列文章更有趣,我觉得把文章名字改为Rails宝典之第N式会很有意思。

今天就以这个开始吧:使用实例变量做查询缓存?

我们经常需要在application.rb里写一个current_user方法来便于得到当前登录的用户:
class ApplicationController < ActionController::Base

  def current_user
    User.find(session[:user_id])
  end

end

问题来了:当我们每次调用current_user来得到当前登录的用户时,我们都会查询一次数据库,这样大大浪费了资源。

所以,我们可以这样做:
class ApplicationController < ActionController::Base

  def current_user
    @current_user ||= User.find(session[:user_id])
  end

end

这样当前用户被实例变量“缓存”起来,大大减少了数据库查询。

看起来不错,但是实际上有问题:
实例变量的作用域是一次请求,即一次请求结束后@current_user这个实例变量就没了,下次请求时会照样调用User.find(session[:user_id])
即每次请求都会查询数据库。

所以这个视频中作者Ryan Bates在script/console中反复调用@current_user ||= User.find(session[:user_id])然后log中显示只查询数据库一次,
这是完全没有意义的!还好后来作者在后面的网页评论中作出了自我批评,但是想不通后面紧跟着一位“chineseGuy”在这里溜须拍马个不亦乐乎,
估计他根本没看懂这部视频,幸庆的是这位国人没有在留言时把自己的名字写成“chineseGay”。

而最重要的是,Rails目前已经内建支持查询缓存,见ActiveRecord源码包里的query_cache.rb。
这样,即使一次请求里调用current_user方法多次,查询缓存仍然会让你只接触数据库一次。

另外,我推荐这种@current_user获取方式:http://hideto.iteye.com/blog/100820
其中logged_in?、require_login、editable?等辅助方法也很有用

非常不幸,第一次介绍Railscasts,结果介绍了一部完全没有价值的教学视频。希望后面的视频会让人满意。
分享到:
评论
6 楼 hideto 2007-07-26  
query_cache就一百行代码,确实没什么好讲的,相信大家都能看懂
5 楼 yananay 2007-07-26  
既然“使用实例变量做查询缓存”是错误的,那总该讲讲
query_cache 吧... :-)
4 楼 笨笨狗 2007-07-25  
的确,按照《agile rails》里面说的,rails针对每次请求都会创建一个控制器对象实例,这样的话,每次都要重新查询生成实例变量的。
至于为什么建议不要在session中存放对象而只是存放数据库id,书里面也有讲的,可以参他在实现购物车时所遇到的问题,正如hideto所述。

非常感谢hideto大大,希望这个系列以及新的系列能持续发表下去,以帮助我们这些rails新手学习,嘿嘿。
3 楼 hideto 2007-07-25  
session里只存user_id,每次取user相关信息时都查一下数据库,这样可以保证取得的user对象数据以及user相关的字段信息(如post_count)都是新的,而直接把user对象存在session里的话,每次更新user相关的数据时就麻烦了,自己去更新session吧。

query_cache则很好用,查询时有缓存而不用连接数据库,如果数据更新,则query_cache会在数据更新后帮你更新缓存。
2 楼 yananay 2007-07-25  
为什么不放到session 里呢?
1 楼 field_song 2007-07-24  
楼主,能否把你的<<the ruby way>> share 一下?

相关推荐

    Rails的精简版本Rails::API.zip

    Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...

    Ruby on Rails:Rails性能优化与缓存策略.docx

    Ruby on Rails:Rails性能优化与缓存策略.docx

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它成为构建现代API的理想选择之一。 ### 一、什么是RESTful API REST(Representational State Transfer)是一种软件架构风格,用于定义...

    Rails中应用Ext.tree:以中国的省市地区三级联动选择为例

    在Ruby on Rails(Rails)框架中,开发人员经常需要实现各种...通过学习这个实例,开发者可以掌握如何在Rails应用中集成第三方库,处理层级数据,以及创建交互式的前端界面。这对于提升Web应用的用户体验非常有价值。

    举例理解Ruby on Rails的页面缓存机制

    1. **启用页面缓存**:在 Rails 中,启用页面缓存只需要一行代码,通常在 `config/environments/production.rb` 文件中设置 `config.action_controller.perform_caching = true`。然后在控制器中使用 `cache_page` ...

    Rails缓存架构设计

    - **ActiveRecord缓存**:Rails内置的ORM框架ActiveRecord提供了强大的缓存支持,包括对象缓存、查询缓存等。 - **cache_fu**:这是一个功能强大的Ruby缓存库,可以有效地管理和利用缓存资源。 - **cache_money**:...

    rails查询学习笔记

    9. **Caching**:为了提高查询效率,Rails支持查询缓存,可以缓存特定查询的结果,避免重复执行相同的数据库操作。 10. **SQL注入防范**:Rails通过绑定参数的方式防止SQL注入,如`Model.where(id: params[:id])`,...

    freak_tags:你一直在看什么?

    FreakTags是一个简单的媒体跟踪器,可让您跟上所有喜欢的节目。统计数据覆盖范围贡献分流贡献者指南-即将发布 让我们运行它 准备环境安装rvm,Ruby(2.2),Rails(4.2),PostgreSQL 进入项目文件夹并运行: ...

    Advanced Rails

    Rails,全称为Ruby on Rails,是一款基于Ruby编程语言的开源Web应用程序框架,以其MVC(模型-视图-控制器)架构模式而闻名。"Advanced Rails" 涵盖了Rails开发中的高级主题和技术,是Ruby on Rails学习进阶的重要...

    Ruby on Rails入门例子

    本篇将通过一个入门实例,深入探讨Rails的基本概念和核心特性。 首先,让我们了解一下Rails的主要组件: 1. **Model**:模型是应用程序中的数据层,它与数据库交互,负责业务逻辑和数据验证。在Rails中,我们通常...

    Ruby On Rails开发实例-源代码

    Ruby on Rails(简称RoR或Rails)是一种基于Ruby语言的开源Web应用框架,它遵循Model-View-Controller(MVC)架构模式,旨在使Web开发更简洁、高效。本实例将帮助你深入理解和实践Rails的开发流程。 首先,让我们从...

    Ruby-RecordCache在Rails3中缓存ActiveModelRecords

    在这个例子中,第一次查找会触发数据库查询并缓存结果。后续相同的查询将直接从缓存中获取,无需再次访问数据库。 **RecordCache的优势** 1. **性能提升**:由于直接从内存中读取数据,RecordCache显著减少了...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    ### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...

    Agile Web Development with Rails 4th edition(敏捷Web开发与Rails:程序指南 第四版)

    1. **ActiveRecord**: ActiveRecord是Rails的核心组件之一,负责处理数据库交互。在第四版中,对ActiveRecord的查询接口进行了优化,提供了更丰富的查询方法,如`pluck`, `exists?`, 和 `includes`,这些都极大地...

    Beginning Rails 4

    #### 第1章:介绍 Rails 框架 这一章节首先介绍了当前 Web 开发领域的现状以及 Ruby on Rails 在其中扮演的角色。接着,详细解释了 Rails 所遵循的一些基本原则和理念,例如约定优于配置(Convention over ...

    Ruby on Rails 指南 v5.0.1 中文版

    - **前提条件**:为了能够顺利地开始Rails的学习之旅,读者需要具备一定的Ruby语言基础,并且对Web开发有一定的了解。 - **Rails是什么?**:Rails是一种用于开发服务器端应用程序的模型-视图-控制器(MVC)框架,它...

    Web开发敏捷之道--应用Rails进行敏捷Web开发 之 Depot代码。

    标题中的“Web开发敏捷之道--应用Rails进行敏捷Web开发 之 Depot代码”表明这是一个关于使用Ruby on Rails框架进行敏捷Web开发的示例项目,名为Depot。Ruby on Rails(简称Rails)是一个开源的Web应用程序框架,它...

    java基础之rails命令大全.pdf

    ### Java基础之Rails命令大全知识点解析 #### 一、Rails 命令概述 Rails 是一个用于 Web 开发的框架,它基于 Ruby 语言。Rails 遵循 MVC(Model-View-Controller)架构模式,使得 Web 应用程序的开发更加高效、简洁...

Global site tag (gtag.js) - Google Analytics