2011-02-01 11 views
17

ActiveRecord क्वेरी में "" और "" में शामिल होने के बीच क्या अंतर है? क्या कोई मुझे निम्नलिखित दो संबंधित मॉडलों के साथ समझा सकता है?ActiveRecord क्वेरी में "शामिल" और "जॉइन" के बीच क्या अंतर है?

class Car < ActiveRecord::Base 
    belongs_to :store 
end 

class Store < ActiveRecord::Base 
    belongs_to :owner 
    has_one :car 
end 

उत्तर

22

:joins टेबल मिलती है एक साथ एसक्यूएल में, :includes उत्सुक लोड संघों n + 1 समस्या से बचने के (जहां एक क्वेरी रिकॉर्ड पुनः प्राप्त करने के मार डाला जाता है और फिर एक संघ प्रति भरी हुई है)।

मेरा सुझाव है कि आप अधिक जानकारी प्राप्त करने के लिए Rails Guides में अपने अनुभाग पढ़ लें।

4

जॉइन सिर्फ टेबल में शामिल होंगे और बदले में चयनित फ़ील्ड लाएंगे। यदि आप क्वेरी परिणाम में शामिल होने पर एसोसिएशन को कॉल करते हैं, तो यह फिर से डेटाबेस क्वेरीज़ को आग लग जाएगा

शामिल एसोसिएशन को शामिल करना और उन्हें स्मृति में जोड़ना शामिल होगा। सभी शामिल टेबल गुणों को लोड करें। , मिलती रिटर्न केवल पढ़ने के लिए वस्तुओं: आप पर संघों को कॉल करते हैं क्वेरी परिणाम में शामिल हैं, यह अभ्यस्त किसी भी प्रश्न

आग आप Active Recrod Associations Tips & Tricks

3

में उदाहरण के साथ विस्तृत विवरण प्राप्त कर सकते हैं शामिल हैं

नहीं करता है: का उपयोग करता है मिलती है आंतरिक शामिल, इसमें बाहरी शामिल होने का उपयोग शामिल है।

का मुख्य कारण: अलग-अलग क्वेरी का उपयोग करके प्रत्येक ऑब्जेक्ट के गुणों में लोड होने की एन + 1 समस्या से बचने के लिए उत्सुक लोडिंग शामिल है।

27
stores = Store.joins(:car) 

यह सभी दुकानों को वापस कर देगा जिसके लिए एक कार है। stores[0].car परिणामस्वरूप एक और प्रश्न होगा।

stores = Store.includes(:car) 

यह सभी स्टोर, कार या कोई कार वापस नहीं करेगा। stores[0].carनहीं परिणामस्वरूप एक और प्रश्न।

stores = Store.includes(:car).joins(:car) 

यह कार के साथ सभी स्टोर वापस कर देगा। stores[0].carनहीं परिणामस्वरूप एक और प्रश्न। मैं has_many संबंधों के लिए इसकी अनुशंसा नहीं करता, लेकिन यह has_one के लिए बहुत अच्छा काम करता है।

0

टीएल; डॉ

में शामिल:

a.joins(:b).to_sql 
=> "SELECT \"a\".* FROM \"a\" INNER JOIN \"b\" ON \"b\".\"id\" = \"a\".\"b_id\"" 

शामिल हैं:

a.includes(:b).to_sql 
=> "SELECT \"a\".* FROM \"a\" 

दोनों:

a.includes(:b).joins(:b).to_sql 
=> "SELECT \"a\".\"id\" AS t0_r0, \"a\".\"a_field_1\" AS t0_r1, \"a\".\"a_field_2\" AS t0_r2, \"a\".\"a_field_3\" AS t0_r3, \"b\".\"a_field_1\" AS t1_r1, \"b\".\"a_field_2\" AS t1_r2, \"b\".\"a_field_3\" AS t1_r3 FROM \"a\" INNER JOIN \"b\" ON \"b\".\"id\" = \"a\".\"plan_id\"" 
संबंधित मुद्दे