2011-04-25 111 views
2

我有一個模型用戶has_many:消息和消息which belongs_to:user。 (1,:include =>:user)它不返回給我的用戶,但如果我做了Message.find(1).to_json(:include =>:user),它確實包含散列中的用戶對象。rails 3:包含find()

我怎樣才能得到它包括在Message.find(1,:include =>:user)?

回答

8

這是一種急切/延遲加載的情況。當你這樣做:

Message.find(1, :include => :user) 

你急切地加載用戶,當你調用@message.user監守,你是不是做另一個查詢來獲取用戶,而這樣做的:

Message.find(1) 

有關消息,並調用@message.user將進行另一個SQL查詢(又名懶加載)。

如果您看看發送到服務器的實際SQL查詢,您將看到在第一個示例中您正在抓取用戶。

它沒有顯示的原因是因爲當你檢查@message它只是顯示消息,而不是調用to_json,這迫使檢查user

+0

如果我打電話給to_json,它將會跳過「(引號)。我能不能逃脫引號嗎?' – ed1t 2011-04-25 18:13:22

2

它包含在SQL查詢中。當您撥打Message.find(1, :include => :user).user時,將不會執行任何查詢。所有的數據都被加載到一個SQL查詢中。

觀察應用程序日誌以獲取證據(tail -f log/development.log)。

3

它包含,因此,如果調用此:

@message = Message.find(1, :include => :user) 
@message.user 

第二次查詢將不會被執行,因爲用戶已經加載,而

@message = Message.find(1) 
@message.user 

將執行兩個詢問

和有用的截屏,以瞭解發生了什麼

http://railscasts.com/episodes/22-eager-loading

+0

我使用的鐵軌控制檯,看看它是否返回與用戶在它的對象。它沒有顯示在那裏。它應該不顯示它嗎? @ message.user確實有效。 – ed1t 2011-04-25 15:16:10

+0

結帳這個截屏:http://railscasts.com/episodes/22-eager-loading – fl00r 2011-04-25 15:20:22

3

這句法能夠與軌道4

Message.includes(:user).find(1) 
+0

不是。'.find'是在Rails 4中已棄用。您需要 Message.includes(:user).where(id:1).first – 2017-07-17 19:33:33