我有一個模型用戶has_many:消息和消息which belongs_to:user。 (1,:include =>:user)它不返回給我的用戶,但如果我做了Message.find(1).to_json(:include =>:user),它確實包含散列中的用戶對象。rails 3:包含find()
我怎樣才能得到它包括在Message.find(1,:include =>:user)?
我有一個模型用戶has_many:消息和消息which belongs_to:user。 (1,:include =>:user)它不返回給我的用戶,但如果我做了Message.find(1).to_json(:include =>:user),它確實包含散列中的用戶對象。rails 3:包含find()
我怎樣才能得到它包括在Message.find(1,:include =>:user)?
這是一種急切/延遲加載的情況。當你這樣做:
Message.find(1, :include => :user)
你急切地加載用戶,當你調用@message.user
監守,你是不是做另一個查詢來獲取用戶,而這樣做的:
Message.find(1)
有關消息,並調用@message.user
將進行另一個SQL查詢(又名懶加載)。
如果您看看發送到服務器的實際SQL查詢,您將看到在第一個示例中您正在抓取用戶。
它沒有顯示的原因是因爲當你檢查@message
它只是顯示消息,而不是調用to_json
,這迫使檢查user
。
它包含在SQL查詢中。當您撥打Message.find(1, :include => :user).user
時,將不會執行任何查詢。所有的數據都被加載到一個SQL查詢中。
觀察應用程序日誌以獲取證據(tail -f log/development.log
)。
它包含,因此,如果調用此:
@message = Message.find(1, :include => :user)
@message.user
第二次查詢將不會被執行,因爲用戶已經加載,而
@message = Message.find(1)
@message.user
將執行兩個詢問
和有用的截屏,以瞭解發生了什麼
這句法能夠與軌道4
Message.includes(:user).find(1)
不是。'.find'是在Rails 4中已棄用。您需要 Message.includes(:user).where(id:1).first – 2017-07-17 19:33:33
如果我打電話給to_json,它將會跳過「(引號)。我能不能逃脫引號嗎?' – ed1t 2011-04-25 18:13:22