我正在閱讀Lynda.com課程「Ruby on Rails 4基本培訓」。它使用創建一個簡單的CMS來教授框架。在此CMS中,用戶可以創建Subjects
和Pages
。每個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個查詢?還是隻是用於學習的目的,最終我的方法會被認爲是兩者中更好的?
第一行代碼爲我拋出一個錯誤:'未定義的方法'包括'爲#<主題:0x007fd4aa7eebf0>' – maxedison 2015-04-05 20:51:39
我可能會將此標記爲答案,如果您可以幫助我解決錯誤正在使用「包含」。評估您推薦的方法而不能對其進行測試很困難。 – maxedison 2015-04-13 18:18:00
我的不好,做了一個愚蠢的錯誤,修復。 – Martin 2015-04-13 18:32:07