看这个页面代码:
[code]
<% for task in @tasks %>
<%= link_to task.name, task_path(task) %> in <%= task.project.name %>
<% end %>
[/code]
上面的代码对每个task对象,取得project的name属性并显示,看看log:
[code]
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) | ...
[/code]
由于ActiveRecord默认是延迟加载的,这样对每个task对象去取project对象时又会查询一次数据库
对于这种情况,我们使用eager loading就比较合适了:
[code]
class TasksController < ApplicationController
def index
@tasks = Task.find(:all, :include => :project)
end
end
[/code]
:include指定我们将project属性一起查询出来,我们再看看log:
[code]
Task Lood Including Associations (0.000681) SELECT tasks.'id' AS t0_r0, tasks.'name' AS t0_r1, tasks.'project_id' AS
t0_r2, projects.'id' AS t1_r0, projects.'name' AS t1_r1 FROM tasks LEFT OUTER JOIN projects ON projects.id = tasks.pro
ject_id
...
Completed in 0.03464 (28 reqs/sec) | ...
[/code]
[code]
<% for task in @tasks %>
<%= link_to task.name, task_path(task) %> in <%= task.project.name %>
<% end %>
[/code]
上面的代码对每个task对象,取得project的name属性并显示,看看log:
[code]
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) | ...
[/code]
由于ActiveRecord默认是延迟加载的,这样对每个task对象去取project对象时又会查询一次数据库
对于这种情况,我们使用eager loading就比较合适了:
[code]
class TasksController < ApplicationController
def index
@tasks = Task.find(:all, :include => :project)
end
end
[/code]
:include指定我们将project属性一起查询出来,我们再看看log:
[code]
Task Lood Including Associations (0.000681) SELECT tasks.'id' AS t0_r0, tasks.'name' AS t0_r1, tasks.'project_id' AS
t0_r2, projects.'id' AS t1_r0, projects.'name' AS t1_r1 FROM tasks LEFT OUTER JOIN projects ON projects.id = tasks.pro
ject_id
...
Completed in 0.03464 (28 reqs/sec) | ...
[/code]