#001_实例变量做查询缓存

看了Kevin Yang对初学者的建议,终于决定开始学习Railscasts了,目前一共有99个例子,暂且希望能每天坚持学习至少一个,并以文字的形式表述出来。

User.find(session[:user_id])

以上代码每次都会向数据库发起一条查询请求,为了提高性能,只需要多加一个或标记,就可以在已赋值的情况下不再发起查询请求。
@current_user ||= User.find(session[:user_id])


不过,论坛中的某位高人说了:
hideto 写道
看起来不错,但是实际上有问题:
实例变量的作用域是一次请求,即一次请求结束后@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?等辅助方法也很有用


所以,其实该例是没有意义的..囧

你可能感兴趣的:(cache,Blog,Ruby,Rails,ActiveRecord)