簡體   English   中英

使用has_many關系會導致其他MySQL查詢嗎?

[英]Using a has_many relationship resulting in an additional MySQL query?

我正在通過Lynda.com課程“ Ruby on Rails 4基本培訓”。 它使用創建一個簡單的CMS來教授該框架。 在此CMS中,用戶可以創建SubjectsPages 每個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM