Rails:include vs.:join這更像是“為什么這樣做的事情”這個(gè)問(wèn)題,而不是“我不知道該怎么做”這個(gè)問(wèn)題......所以關(guān)于拉動(dòng)你知道你將要使用的相關(guān)記錄的福音就是使用,:include因?yàn)槟銓@得一個(gè)連接并避免一大堆額外的查詢:Post.all(:include => :comments)但是,當(dāng)您查看日志時(shí),沒(méi)有發(fā)生加入: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)它正在采取一種捷徑,因?yàn)樗鼤?huì)立即提取所有注釋,但它仍然不是連接(這是所有文檔似乎都說(shuō)的)。我可以獲得連接的唯一方法是使用:joins而不是:include:Post.all(:joins => :comments)日志顯示:Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id我錯(cuò)過(guò)了什么嗎?我有一個(gè)有六個(gè)關(guān)聯(lián)的應(yīng)用程序,在一個(gè)屏幕上我顯示所有這些數(shù)據(jù)。似乎最好有一個(gè)加入查詢而不是6個(gè)人。我知道在性能方面,進(jìn)行連接而不是單個(gè)查詢并不總是更好(事實(shí)上,如果你花費(fèi)時(shí)間,看起來(lái)上面的兩個(gè)單獨(dú)的查詢比連接更快),但是在所有文檔之后我一直在閱讀,我很驚訝地看到:include不像宣傳的那樣工作。也許Rails的是認(rèn)識(shí)到性能問(wèn)題,并除非在某些情況下,不加入呢?
3 回答

千萬(wàn)里不及你
TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
似乎:include
Rails 2.1改變了功能。Rails用于在所有情況下進(jìn)行連接,但出于性能原因,在某些情況下將其更改為使用多個(gè)查詢。 Fabio Akita的這篇博客文章提供了有關(guān)變化的一些很好的信息(參見(jiàn)標(biāo)題為“Optimized Eager Loading”的部分)。

藍(lán)山帝景
TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
.joins
將只加入表格并帶來(lái)選定的字段作為回報(bào)。如果在連接查詢結(jié)果上調(diào)用關(guān)聯(lián),它將再次觸發(fā)數(shù)據(jù)庫(kù)查詢
:includes
將急切加載包含的關(guān)聯(lián)并將其添加到內(nèi)存中。:includes
加載所有包含的表屬性。如果在包含查詢結(jié)果上調(diào)用關(guān)聯(lián),則不會(huì)觸發(fā)任何查詢
- 3 回答
- 0 關(guān)注
- 666 瀏覽
添加回答
舉報(bào)
0/150
提交
取消