2011-03-08 17 views
9

यह देखते हुए कि मुझे उपयोगकर्ता गठबंधन और अटैचमेंट मिला। संख्या संख्या के साथ एक पूर्णांक के रूप में विज़िट करता है।नेस्टेड संग्रह के सभी गुणों को कैसे समेटें?

मैं उस उपयोगकर्ता की सभी छवियों की सभी यात्राओं को आसानी से कैसे गिन सकता हूं?

उत्तर

18

उपयोग ActiveRecord::Base#sum:

user.attachments.sum(:visits) 

यह इस तरह एक कुशल SQL क्वेरी उत्पन्न करनी चाहिए:

SELECT SUM(attachments.visits) FROM attachments WHERE attachments.user_id = ID 
+0

यदि आप विज़िट का दायरा जोड़ना चाहते हैं तो क्या होगा। उदाहरण के लिए, विज़िट का दायरा होता है: सक्रिय, -> {जहां ('विशेषता पूर्ण नहीं है')}। कुछ "user.attachments.sum (visit.active) की तरह कुछ? – doug

12
user.attachments.map{|a| a.visits}.sum 
+5

या 'user.att achments.map (&: विज़िट) .sum' – rubyprince

+10

या 'user.attachments.sum (&: विज़िट)' – Jordan

+0

वास्तव में, @ Jordon का समाधान सबसे अच्छा है। – Calin

5

वहाँ भी inject है:

user.attachments.inject(0) { |sum, a| sum + a.visits } 

लोग आम तौर पर (और काफी ठीक ही) inject नफरत है, लेकिन जब से दो इस को प्राप्त करने के अन्य तरीके हैं जिनसे उल्लेख किया गया है, मैंने सोचा कि मैं के रूप में अच्छी तरह से फेंक सकता है वहाँ से बाहर। :)

2

सादा पुराना रूबी वस्तुओं के साथ निम्न काम करता है, और मुझे लगता है निम्नलिखित मामूली तेजी से होता है count += a.visits का उपयोग करने के अलावा, इसके अलावा इसमें एक इमोटिकॉन है:

user.attachments.map(&:visits).inject(:+) 
+0

हाहाहाह अब तक, सबसे अच्छा जवाब हाहाहा – facundofarias

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