Rails寶典之第二十二式: eager loading

看這個頁面代碼: 
Java代碼  收藏代碼
  1. <% for task in @tasks %>  
  2.   <%= link_to task.name, task_path(task) %> in <%= task.project.name %>  
  3. <% end %>  

上面的代碼對每個task對象,取得project的name屬性並顯示,看看log: 
Java代碼  收藏代碼
  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) | ...  

由於ActiveRecord默認是延遲加載的,這樣對每個task對象去取project對象時又會查詢一次數據庫 
對於這種情況,我們使用eager loading就比較合適了: 
Java代碼  收藏代碼
  1. class TasksController < ApplicationController  
  2.   def index  
  3.     @tasks = Task.find(:all, :include => :project)  
  4.   end  
  5. end  

:include指定我們將project屬性一起查詢出來,我們再看看log: 
Java代碼  收藏代碼
  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) | ...  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章