Ruby on rails开发从头来(五十九)- ActiveRecord基础(预加载子记录)
来源:互联网 发布:c 多进程编程 编辑:程序博客网 时间:2024/04/30 03:20
classPost < ActiveRecord::Base
belongs_to:author
has_many:comments, :order =>'created_on DESC'
end
如果我们遍历所有的post,访问作者和评论属性,我们使用一个Sql查询来返回posts表中的多条记录,并且对于每条post记录都要执行一次Sql来访问authors表和comments表,总共是2n+1次。
forpostinPost.find(:all)
puts"Post: #{post.title}"
puts"Written by: #{post.author.name}"
puts"Last comment on:#{post.comments.first.created_on}"
end
上面的代码存在着严重的性能问题,我们可以通过find方法的:include参数来修正它,在find方法被执行时,会列出需要延迟加载的关联。Active Record会很聪明地使用一条SQL一次加载数据,如果有100个post,和上面的代码相比,下面的代码将会消除100次数据库查询:
forpostinPost.find(:all, :include=> :author)
puts"Post: #{post.title}"
puts"Written by: #{post.author.name}"
puts"Last comment on:#{post.comments.first.created_on}"
end
这个例子还可以更简化,只使用一条SQL:
forpostinPost.find(:all, :include=> [:author, :comments])
puts"Post: #{post.title}"
puts"Written by: #{post.author.name}"
puts"Last comment on: #{post.comments.first.created_on}"
end
预加载子记录并不能保证改善性能(事实上,如果你的数据库不支持左连接,那么你就不能使用延迟加载,如果你使用的是oracle8,就必须要升级到oracle9才可以),因为预加载在Sql中加入了所有的表,这样就会有很多记录被加载后转换成Model类的对象,这样就有可能导致内存使用的问题,特别是当一条记录有很多条子记录时,这种情况就更明显,与一条条地延迟加载子记录相比,预加载会占用更多的服务器内存。
如果你使用了:include,你需要使用find方法的参数消除列名的歧义,在列名前添加表名来区分,在下面的例子中,title列需要添加表名前缀:
forpostinPost.find(:all,:conditions =>"posts.title like'%ruby%'",
:include=> [:author, :comment])
# ...
end
- Ruby on rails开发从头来(五十九)- ActiveRecord基础(预加载子记录)
- Ruby on rails开发从头来(五十九)- ActiveRecord基础(预加载子记录)
- Ruby on rails开发从头来(三十七)- ActiveRecord基础
- Ruby on rails开发从头来(四十四)- ActiveRecord基础(创建记录)
- Ruby on rails开发从头来(四十五)- ActiveRecord基础(读取记录)
- Ruby on rails开发从头来(五十)- ActiveRecord基础(更新记录)
- Ruby on rails开发从头来(五十二)- ActiveRecord基础(删除记录)
- Ruby on rails开发从头来(五十二)- ActiveRecord基础(删除记录)
- Ruby on rails开发从头来(五十)- ActiveRecord基础(更新记录)
- Ruby on rails开发从头来(四十五)- ActiveRecord基础(读取记录)
- Ruby on rails开发从头来(四十四)- ActiveRecord基础(创建记录)
- Ruby on rails开发从头来(三十八)- ActiveRecord基础(列和属性)
- Ruby on rails开发从头来(三十八)- ActiveRecord基础(列和属性)
- Ruby on rails开发从头来(三十九)- ActiveRecord基础(访问属性)
- Ruby on rails开发从头来(四十)- ActiveRecord基础(Boolean属性)
- Ruby on rails开发从头来(四十一)- ActiveRecord基础(存储结构化数据)
- Ruby on rails开发从头来(四十二)- ActiveRecord基础(主键和ID)
- Ruby on rails开发从头来(四十三)- ActiveRecord基础(连接数据库)
- ones刻录软件怎么用
- ojective学习之四
- 在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。
- map 的插入方法 下标法 和 insert 法的区别
- POJ 1250 Tanning Salon
- Ruby on rails开发从头来(五十九)- ActiveRecord基础(预加载子记录)
- 图片画的时候差别很大 透明度问题
- C/C++计时功能实现问题整理
- 找不到方向的飞鸟
- android镜像制作方法
- linux内核选项部分翻译
- 放大镜效果
- Ruby on rails开发从头来(五十六)- ActiveRecord基础(一对多关联关系)
- 微软面试题:有100万个数字(1到9),其中只有1个数字重复2次,如何快速找出该数字