2013-01-07 40 views
11

मेरे पास एक क्लाइंट मॉडल और एक उत्पाद मॉडल है जहां ग्राहक के पास कई उत्पाद हैं और उत्पाद क्लाइंट से संबंधित है।रेल सक्रिय ActiveRecord रिटर्न रिकॉर्ड जहां आईडी संबंधित तालिका में मौजूद है

मैं एक प्रश्न है कि केवल ग्राहकों को देता है खोजने के लिए यदि वे उत्पाद तालिका में एक रिकॉर्ड है

ग्राहकों तालिका

id |  name 
-------------- 
1 | Company A 
2 | Company B 
3 | Company C 

उत्पादों तालिका

id |  name | client_id 
--------------------------- 
1 | Product A |   1 
2 | Product B |   1 
3 | Product C |   3 
4 | Product D |   3 
5 | Product E |   1 

मैं केवल जरूरत है ग्राहकों को 1 की जरूरत है 3

उदाहरण के लिए

जैसे कुछ
@clients = Client.where("client exists in products") #something to this effect 
+0

'@clients करता है = ग्राहक। Joins (: उत्पादों) 'काम करता है? मुझे लगता है कि यह एक इंटर्न जॉइन करेगा, जो है (मुझे लगता है) आप क्या चाहते हैं – pjam

+0

यह एक अच्छा सवाल है, मैं कंसोल – ctilley79

+0

@pjam में परीक्षण करूंगा ऐसा लगता है कि क्लाइंट में शामिल सभी उत्पादों को वापस लौटाया जाता है इसलिए मैं समाप्त होता हूं डुप्लिकेट ग्राहक नाम। क्या परिणाम केवल ग्राहकों को सीमित करने का कोई तरीका है? – ctilley79

उत्तर

17

सरल नहीं बल्कि सबसे तेजी से:

Client.where(:id => Product.select(:client_id).map(&:client_id)) 

एसक्यूएल सबक्वेरी (अधिक तेजी से):

Client.where("EXISTS(SELECT 1 from products where clients.id = products.client_id)") 
+0

यह एक बेहतर जवाब है, 'अनावश्यक कॉलम वापस नहीं करता है जिसमें एक जॉइन स्टेटमेंट शामिल होगा। – ctilley79

+0

मुझे यह जवाब वाकई पसंद है। दूसरी क्वेरी मुझे एक गैर-सक्रिय रिकॉर्ड तालिका के विरुद्ध तुलना करने की अनुमति देती है जो एक ही डीबी में है। – BaneOfSerenity

5

यहाँ एक और समाधान है। यह वालेरी की दूसरी समाधान की तरह एक सबक्वेरी है, लेकिन एसक्यूएल लिखने के बिना:

Client.where(Product.where(client_id: Client.arel_table[:id]).exists) 
+0

यह मेरे लिए काम नहीं करता है (postgresql एडाप्टर का उपयोग कर); arel_table param को एक तैयार मान के रूप में व्याख्या करना जारी रखता है, और उसके बाद त्रुटि हो रही है क्योंकि यह एक नहीं है। – hoffmanc

+1

मैंने अभी सीखा है, कि '.exists' सार्वजनिक एपीआई का हिस्सा नहीं है। यह 4.1 तक काम करता था, लेकिन 4.2 पर और नहीं। – svoop

6

यहाँ समाधान जो Where Exists मणि का उपयोग करता है (प्रकटीकरण: मैं उसके लेखक हूँ):

Client.where_exists(:products) 
+1

अच्छा मणि! सुरुचिपूर्ण लग रहा है! –

+0

बहुत बढ़िया काम, धन्यवाद! –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^