亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Rails:include vs.:join

Rails:include vs.:join

米琪卡哇伊 2019-07-25 15:36:58
Rails:include vs.:join這更像是“為什么這樣做的事情”這個問題,而不是“我不知道該怎么做”這個問題......所以關于拉動你知道你將要使用的相關記錄的福音就是使用,:include因為你將獲得一個連接并避免一大堆額外的查詢:Post.all(:include => :comments)但是,當您查看日志時,沒有發生加入:Post Load (3.7ms)   SELECT * FROM "posts"Comment Load (0.2ms)   SELECT "comments.*" FROM "comments"                         WHERE ("comments".post_id IN (1,2,3,4))                         ORDER BY created_at asc)它正在采取一種捷徑,因為它會立即提取所有注釋,但它仍然不是連接(這是所有文檔似乎都說的)。我可以獲得連接的唯一方法是使用:joins而不是:include:Post.all(:joins => :comments)日志顯示:Post Load (6.0ms)  SELECT "posts".* FROM "posts"                     INNER JOIN "comments" ON "posts".id = "comments".post_id我錯過了什么嗎?我有一個有六個關聯的應用程序,在一個屏幕上我顯示所有這些數據。似乎最好有一個加入查詢而不是6個人。我知道在性能方面,進行連接而不是單個查詢并不總是更好(事實上,如果你花費時間,看起來上面的兩個單獨的查詢比連接更快),但是在所有文檔之后我一直在閱讀,我很驚訝地看到:include不像宣傳的那樣工作。也許Rails的是認識到性能問題,并除非在某些情況下,不加入呢?
查看完整描述

3 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

似乎:includeRails 2.1改變了功能。Rails用于在所有情況下進行連接,但出于性能原因,在某些情況下將其更改為使用多個查詢。 Fabio Akita的這篇博客文章提供了有關變化的一些很好的信息(參見標題為“Optimized Eager Loading”的部分)。


查看完整回答
反對 回復 2019-07-25
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

.joins將只加入表格并帶來選定的字段作為回報。如果在連接查詢結果上調用關聯,它將再次觸發數據庫查詢

:includes將急切加載包含的關聯并將其添加到內存中。:includes加載所有包含的表屬性。如果在包含查詢結果上調用關聯,則不會觸發任何查詢


查看完整回答
反對 回復 2019-07-25
  • 3 回答
  • 0 關注
  • 661 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號