- <% for task in @tasks %>
- <%= link_to task.name, task_path(task) %> in <%= task.project.name %>
- <% end %>
上面的代碼對每個task對象,取得project的name屬性並顯示,看看log:
- 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就比較合適了:
- class TasksController < ApplicationController
- def index
- @tasks = Task.find(:all, :include => :project)
- end
- end
:include指定我們將project屬性一起查詢出來,我們再看看log:
- 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) | ...