एक से अधिक खरीदारी वाली उपयोगकर्ता आईडी की सूची प्राप्त करने के लिए, आप निम्न कार्य कर सकते हैं, जो केवल एक तालिका तक पहुंचेगा:
user_ids = PurchasedDeal.count(:group => :user_id, :having => 'count_all > 0').keys
इसके बाद, आप इन सभी उपयोगकर्ताओं को इसके साथ ला सकते हैं:
users = User.find user_ids
काउंटर कैश के साथ चीजों को तेज किया जा सकता है। अपने उपयोगकर्ता मॉडल में, विकल्प जोड़ें :counter_cache => true
करने के लिए has_many
खरीदे गए सौदों के लिए एसोसिएशन। आपको अपनी उपयोगकर्ता तालिका और इनिशियलाइज़ पर एक अतिरिक्त पूर्णांक कॉलम की आवश्यकता होगी, जो माइग्रेशन में इस प्रकार दिखाई दे सकता है:
add_column :users, :purchased_deals_count, :integer, :null => false, :default => 0
User.each { |u| User.reset_counters u, :purchased_deals }
एक बार जब यह रास्ते से हट जाता है, तो यह बहुत आसान हो जाता है:
users = User.all :conditions => 'purchased_deals_count > 0'
अधिकांश मानक संचालन के साथ रेल आपके लिए कॉलम को अप-टू-डेट रखेंगे।
कुल मूल्य प्राप्त करने के लिए हमेशा शामिल होना शामिल होगा। या आप सौदे की कीमतों का एक हैश बना सकते हैं और रूबी में थकाऊ प्रसंस्करण कर सकते हैं। मैं कोई SQL विशेषज्ञ नहीं हूं, लेकिन आप खरीददारी डील के साथ मूल्य संग्रहीत करके संभावित रूप से शामिल होने से छुटकारा पा सकते हैं। अन्यथा, यहां शामिल होने के साथ इसे करने का तरीका बताया गया है:
user_id_to_price = PurchasedDeal.sum 'deal.price', :include => :deal, :group => :user_id
आप :conditions => ['user_id IN (?)', users]
जैसे कुछ जोड़कर केवल उन उपयोगकर्ताओं पर फ़िल्टर कर सकते हैं जिन्हें आप चाहते हैं। . (जहां users
आईडी की सूची हो सकती है, लेकिन उपयोगकर्ता ऑब्जेक्ट भी।)