2013-07-14 5 views
5

अपने आवेदन में, मैं एक सरणी @apps जो एप्लिकेशन के नाम, पर्यावरण युक्त एक रिकॉर्ड के साथ ActiveRecord से भरी हुई है, जिसका नाम है आदिमैं ऐसे सरणी में आइटम कैसे गिन सकता हूं जिसमें विशिष्ट विशेषता मान हो?

मैं वर्तमान में @apps.count उपयोग कर रहा हूँ सरणी में ऐप्लिकेशन की संख्या प्राप्त करने के लिए, लेकिन मैं एरे में अनुप्रयोगों की संख्या गिनने में परेशानी हो रही है जहां environment = 0 है।

मैंने @apps.count(0) की कोशिश की लेकिन यह काम नहीं किया क्योंकि प्रत्येक रिकॉर्ड के लिए कई फ़ील्ड हैं।

मैंने @apps.count{ |environment| environment = 0} जैसे कुछ भी कोशिश की लेकिन कुछ भी नहीं हुआ।

कोई सुझाव?

उत्तर

12

बस आप क्या चाहते हैं के लिए नीचे संकीर्ण करने के लिए select का उपयोग करें:

@apps.select {|a| a.environment == 0}.count 

हालांकि, अगर यह ActiveRecord पर आधारित है, तो आप बेहतर होगा सिर्फ बनाने अपने प्रारंभिक क्वेरी सीमित जब तक कि बेशक आप सभी की जरूरत है रिकॉर्ड्स के और अलग-अलग उद्देश्यों के लिए उन्हें अलग-अलग तरीकों से फ़िल्टर कर रहे हैं।

मैं अपने मॉडल मान लेंगे कॉल App के बाद आप उन्हें @apps में डाल रहे हैं:

App.where(environment: 0).count 
+0

मैं पहले समाधान के साथ जा रहा हूं क्योंकि मुझे सभी रिकॉर्ड की आवश्यकता है। – ny95

+3

रिकॉर्ड्स की संख्या के आधार पर, रिकॉर्डिंग की गणना करने के लिए डीबीएम से पूछना तेज़ी से हो सकता है, फिर एक रिकॉर्ड में फिर से रिकॉर्ड करना, सभी रिकॉर्ड के लिए पूछना है, फिर रूबी में गिनें और फिर से भरें। डीबीएम को 'गिनती' और फिर पंक्ति-दर-पंक्ति को फिर से चलाने के लिए अनुकूलित किया गया है। एक बार में एक पूरी टेबल डंप करने से आपके डीबी, डीबी होस्ट, नेटवर्क, आपका कोड होस्ट हो जाएगा, और आपके रेल सर्वर और ऐप को हराया जाएगा। –

4

आप चर गलत है। इसके अलावा, आपके पास तुलना के बजाय असाइनमेंट है।

@apps.count{|app| app.environment == 0} 

या

@apps.count{|app| app.environment.zero?} 
+0

ऐसा लगता है कि यह हमेशा '@ apps.count' वापस लौटाता है चाहे उसका 'सत्य' या 'झूठा' हो। उदाहरण के लिए, '@ apps.count {| app | गलत} == @ apps.count {| ऐप | सच} ' – Trip

0

मैं का प्रयोग करेंगे reduce या each_with_object यहाँ:

reduce docs:

@apps.reduce(Hash.new(0)) do |counts, app| 
    counts[app.environment] += 1 
    counts 
end 

each_with_object docs:

@apps.each_with_object(Hash.new(0)) do |app, counts| 
    counts[app.environment] += 1 
end 

आप क्वेरी करने के लिए सक्षम हैं, तो एसक्यूएल

App.group(:environment).count और गिनती के रूप में पर्यावरण के रूप में कुंजी मूल्यों के साथ एक हैश वापस आ जाएगी का उपयोग करें।

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