2013-01-20 87 views
0

@teachers = User.joins(:students).where("student_id IS NOT NULL")Rails查詢]加入之間的區別

上面的工作,下面沒有。

@teachers = User.includes(:students).where("student_id IS NOT NULL")

據我瞭解,連接和包括應既帶來不同的性能相同的結果。根據this,您使用includes加載由Model調用的對象的關聯記錄,其中joins只需將兩個表一起添加。使用includes也可以防止N+1 queries

第一個問題:爲什麼我的第二行代碼不工作?

第二個問題:任何人都應該在類似於上面的情況下總是使用includes

+0

你是什麼意思不起作用? –

+3

檢查了這一點:http://railscasts.com/episodes/181-include-vs-joins – Nobita

回答

0

當您想要針對連接的模型進行查詢時使用連接。這是在你的表之間進行內部連接。

包括是當你想要加載相關模型到最終結果。
這使您可以在任何結果上調用關聯,而無需再次執行數據庫查找。 您無法查詢通過包含加載的模型。如果你想查詢它,你必須使用連接(你可以做到這一點!)

+0

感謝您的關於不能夠查詢一個只包括項目。 –

+0

現在還不完全正確,現在可以在連接查詢中運行條件:http://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-eager-loaded-associations –

+0

這是不正確的,你當然可以做再次查詢使用「引用」加載的模型。 – weexpectedTHIS