2013-11-25 4 views
46

से अधिक एसोसिएशन की गिनती है, मैं ऐसा कुछ करने की कोशिश कर रहा हूं जिसे मैंने सोचा था कि यह आसान होगा लेकिन ऐसा नहीं लगता है।उन सभी रिकॉर्ड्स खोजें जिनके पास शून्य

मेरे पास एक प्रोजेक्ट मॉडल है जिसमें कई रिक्तियां हैं।

class Project < ActiveRecord::Base 

    has_many :vacancies, :dependent => :destroy 

end 

मैं उन सभी परियोजनाओं को प्राप्त करना चाहता हूं जिनमें कम से कम 1 रिक्ति है। मैं कुछ इस तरह की कोशिश की:

Project.joins(:vacancies).where('count(vacancies) > 0') 

लेकिन यह कहते

SQLite3::SQLException: no such column: vacancies: SELECT "projects".* FROM "projects" INNER JOIN "vacancies" ON "vacancies"."project_id" = "projects"."id" WHERE ("projects"."deleted_at" IS NULL) AND (count(vacancies) > 0)

उत्तर

29

joins एक आंतरिक इतना प्रभाव में Project.joins(:vacancies) इच्छा का उपयोग कर केवल परियोजनाओं एक संबद्ध रिक्ति है कि वापसी डिफ़ॉल्ट रूप से शामिल होने के उपयोग करता है।

अद्यतन:

के रूप में टिप्पणी में @mackskatz से कहा, एक group खंड के बिना, ऊपर कोड एक से अधिक रिक्त पदों के साथ परियोजनाओं के लिए डुप्लिकेट परियोजनाओं वापस आ जाएगी। डुप्लिकेट को हटाने के लिए,

Project.joins(:vacancies).group('projects.id') 
+0

हालांकि, खंड द्वारा समूह को लागू किए बिना यह परियोजनाओं के लिए कई परियोजना वस्तुओं को वापस कर देगा जिनमें एक से अधिक रिक्तियां होंगी। – mackshkatz

19

हाँ, vacancies शामिल होने में कोई क्षेत्र नहीं है। मेरा मानना ​​है कि आप चाहते हैं:

Project.joins(:vacancies).group("projects.id").having("count(vacancies.id)>0") 
+0

कहां से: छुट्टियां आईं? –

-4

त्रुटि आपको बता रही है कि रिक्त पद परियोजनाओं में एक स्तंभ नहीं है।

यह

Project.joins(:vacancies).where('COUNT(vacancies.project_id) > 0') 
+4

'WHERE' – squixy

87

1) काम करना चाहिए कम से कम 1 रिक्ति के साथ परियोजनाओं पाने के लिए:

Project.joins(:vacancies).group('projects.id').having('count(project_id) > 1') 

:

Project.joins(:vacancies).group('projects.id') 

2) 1 से अधिक रिक्ति के साथ परियोजनाओं प्राप्त करने के लिए 3) या, यदि Vacancy मॉडल काउंटर कैश सेट करता है:

belongs_to :project, counter_cache: true 

तो यह काम करेंगे, भी:

vacancy के लिए
Project.where('vacancies_count > ?', 1) 

मोड़ नियम specified manually होने की आवश्यकता हो सकती है?

2
# None 
Project.joins(:vacancies).group('projects.id').having('count(vacancies) = 0') 
# Any 
Project.joins(:vacancies).group('projects.id').having('count(vacancies) > 0') 
# One 
Project.joins(:vacancies).group('projects.id').having('count(vacancies) = 1') 
# More than 1 
Project.joins(:vacancies).group('projects.id').having('count(vacancies) > 1') 
0

ज्यादा रेल जादू के बिना, आप कर सकते हैं:

Project.where('(SELECT COUNT(*) FROM vacancies WHERE vacancies.project_id = projects.id) > 0') 

की स्थिति इस प्रकार का काम के रूप में ज्यादा सभी रेल संस्करणों में काम करेंगे डीबी पक्ष पर सीधे किया जाता है। इसके अलावा, चेनिंग .count विधि अच्छी तरह से काम करेगी। मुझे पहले Project.joins(:vacancies) जैसे प्रश्नों से जला दिया गया है। बेशक, पेशेवर और विपक्ष हैं क्योंकि यह डीबी अज्ञेयवादी नहीं है।

+0

में कुल कार्यों की अनुमति नहीं है, यह' चुनिंदा गिनती (*) .. 'प्रत्येक प्रोजेक्ट के लिए निष्पादित करेगा, क्योंकि समूह और समूह विधि से बहुत धीमी है। – YasirAzgar

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

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