Om een lijst met gebruikers-ID's bij meer dan één aankoop te krijgen, kunt u het volgende doen, waarmee u slechts één tabel kunt gebruiken:
user_ids = PurchasedDeal.count(:group => :user_id, :having => 'count_all > 0').keys
Vervolgens kunt u al deze gebruikers ophalen met:
users = User.find user_ids
Dingen kunnen worden versneld met een counter-cache. Voeg in uw gebruikersmodel de optie toe :counter_cache => true
naar de has_many
vereniging voor koopovereenkomsten. U heeft een extra integer-kolom nodig in uw gebruikerstabel en initialiseert, wat er bij een migratie als volgt uit kan zien:
add_column :users, :purchased_deals_count, :integer, :null => false, :default => 0
User.each { |u| User.reset_counters u, :purchased_deals }
Als dat eenmaal uit de weg is, wordt het een stuk eenvoudiger:
users = User.all :conditions => 'purchased_deals_count > 0'
Rails houdt de kolom voor u up-to-date, met de meeste standaard bewerkingen.
Om de totaalprijs te krijgen zal altijd een join nodig zijn. Of u kunt een hash van dealprijzen opbouwen en de vervelende verwerking in Ruby doen. Ik ben geen SQL-expert, maar je kunt de join mogelijk verwijderen door de prijs op te slaan bij de PurchasedDeal. Anders kun je het als volgt doen met een join:
user_id_to_price = PurchasedDeal.sum 'deal.price', :include => :deal, :group => :user_id
Je zou dat kunnen filteren op alleen de gebruikers die je wilt door iets toe te voegen als :conditions => ['user_id IN (?)', users]
. (Waar users
kan een lijst met ID's zijn, maar ook gebruikersobjecten.)