2015-04-05 32 views
0

我正在閱讀Lynda.com課程「Ruby on Rails 4基本培訓」。它使用創建一個簡單的CMS來教授框架。在此CMS中,用戶可以創建SubjectsPages。每個Subject有很多Pages。點擊鏈接查看屬於特定主題的頁面時,會將主題ID作爲參數傳遞給Pages controller。該頁面然後,控制器將執行以下操作以確定要顯示的頁面:使用has_many關係導致額外的MySQL查詢?

@subject = Subject.find(params[:subject_id]) 
@pages = @subject.pages 

這種簡單,是有道理的,並且非常理解的代碼的結果。但是,通過首先加載Subject,然後查找其頁面,會導致額外的數據庫調用。在控制檯中我看到:

Subject Load (0.3ms) SELECT `subjects`.* FROM `subjects` WHERE `subjects`.`id` = 3 LIMIT 1 
    Page Load (0.3ms) SELECT `pages`.* FROM `pages` WHERE `pages`.`subject_id` = 3 ORDER BY pages.position ASC 

這在我看來,更有效的辦法是寫類似:

@pages = Page.where(subject_id: params[:subject_id]) 

事實上,我看到的只是一個單一的SQL查詢時,我這樣做。使用第一種方法是否被認爲是最佳做法,儘管它會導致2個查詢?還是隻是用於學習的目的,最終我的方法會被認爲是兩者中更好的?

回答

0

如果你不想要你的@subject或者基本上是主題記錄,那麼就不需要使用前者,你可以直接訪問你以後寫的方法。

1

首先取決於您是否需要@subject和@pages對象。你說得對,你的建議更具性能,現在這可能會或可能不會對你的用戶產生真正的影響 - 你需要確定分析。

最後,有可能作出的教程代碼略有變化,使其作爲高性能使用「包括」:

@subject = Subject.includes(:pages).find(params[:subject_id]) 
@pages = @subject.pages 

這將加載使用單個查詢一切。

+0

第一行代碼爲我拋出一個錯誤:'未定義的方法'包括'爲#<主題:0x007fd4aa7eebf0>' – maxedison 2015-04-05 20:51:39

+0

我可能會將此標記爲答案,如果您可以幫助我解決錯誤正在使用「包含」。評估您推薦的方法而不能對其進行測試很困難。 – maxedison 2015-04-13 18:18:00

+0

我的不好,做了一個愚蠢的錯誤,修復。 – Martin 2015-04-13 18:32:07