诗歌rails之Rails eager loading

本文介绍了一种优化Rails应用程序性能的方法——Eager Loading。通过避免N+1查询问题,该技术可以显著提高应用效率。文章详细解释了如何在控制器中实现这一技术,并展示了使用前后对数据库查询次数的影响。
看这个页面代码:
ruby代码
  1. <% for task in @tasks %>  
  2.   <%= link_to task.name, task_path(task) %> in <%= task.project.name %>  
  3. <% end %>  
<% for task in @tasks %>   <%= link_to task.name, task_path(task) %> in <%= task.project.name %> <% end %> 

上面的代码对每个task对象,取得project的name属性并显示,看看log:
ruby代码
  1. Project Lood (0.000131)  SELECT * FROM projects WHERE (projects.id = 330)  
  2. Project Lood (0.000156)  SELECT * FROM projects WHERE (projects.id = 330)  
  3. Project Lood (0.000136)  SELECT * FROM projects WHERE (projects.id = 330)  
  4. Project Lood (0.000138)  SELECT * FROM projects WHERE (projects.id = 330)  
  5. Project Lood (0.000133)  SELECT * FROM projects WHERE (projects.id = 330)  
  6. Project Lood (0.000128)  SELECT * FROM projects WHERE (projects.id = 330)  
  7. ...  
  8. Completed in 0.14792 (6 reqs/sec) | ...  
Project Lood (0.000131)  SELECT * FROM projects WHERE (projects.id = 330) Project Lood (0.000156)  SELECT * FROM projects WHERE (projects.id = 330) Project Lood (0.000136)  SELECT * FROM projects WHERE (projects.id = 330) Project Lood (0.000138)  SELECT * FROM projects WHERE (projects.id = 330) Project Lood (0.000133)  SELECT * FROM projects WHERE (projects.id = 330) Project Lood (0.000128)  SELECT * FROM projects WHERE (projects.id = 330) ... Completed in 0.14792 (6 reqs/sec) | ... 

由于ActiveRecord默认是延迟加载的,这样对每个task对象去取project对象时又会查询一次数据库
对于这种情况,我们使用eager loading就比较合适了:
ruby代码
  1. class TasksController < ApplicationController  
  2.   def index  
  3.     @tasks = Task.find(:all, :include => :project)  
  4.   end  
  5. end  
class TasksController < ApplicationController   def index     @tasks = Task.find(:all, :include => :project)   end end 

:include指定我们将project属性一起查询出来,我们再看看log:
ruby代码
  1. Task Lood Including Associations (0.000681)  SELECT tasks.'id' AS t0_r0, tasks.'name' AS t0_r1, tasks.'project_id' AS  
  2. t0_r2, projects.'id' AS t1_r0, projects.'name' AS t1_r1 FROM tasks LEFT OUTER JOIN projects ON projects.id = tasks.pro  
  3. ject_id  
  4. ...  
  5. Completed in 0.03464 (28 reqs/sec) | ...

转载于:https://www.cnblogs.com/orez88/articles/1518466.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值