[英]Using a has_many relationship resulting in an additional MySQL query?
我正在通過Lynda.com課程“ Ruby on Rails 4基本培訓”。 它使用創建一個簡單的CMS來教授該框架。 在此CMS中,用戶可以創建Subjects
和Pages
。 每個Subject
都有很多Pages
。 單擊鏈接查看屬於特定主題的頁面時,它將主題ID作為參數傳遞給Pages controller
。 然后,頁面控制器執行以下操作以確定要顯示的頁面:
@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個查詢,但使用第一種方法是否被認為是最佳實踐? 還是只是出於學習目的,最終我的方法會被認為是兩者中較好的一種?
首先取決於您是否同時需要@subject和@pages對象。 沒錯,您的提案更有效,現在這可能對您的用戶沒有真正的影響-您需要進行分析以確保。
最后,可以使用“ includes”對教程代碼進行少許更改以使其表現出色:
@subject = Subject.includes(:pages).find(params[:subject_id])
@pages = @subject.pages
這將通過單個查詢加載所有內容。
如果您不希望使用@subject或基本上是主題記錄,則無需使用前者,則可以使用在以后的方法中編寫的內容直接訪問頁面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.