För att få en lista över användar-ID:n med mer än ett köp kan du göra följande, vilket bara kommer åt en tabell:
user_ids = PurchasedDeal.count(:group => :user_id, :having => 'count_all > 0').keys
Därefter kan du hämta alla dessa användare med:
users = User.find user_ids
Saker och ting kan snabbas upp med en räknarcache. Lägg till alternativet :counter_cache => true
i din användarmodell till has_many
förening för köpta affärer. Du behöver en extra heltalskolumn i användartabellen och initialisera, vilket kan se ut så här i en migrering:
add_column :users, :purchased_deals_count, :integer, :null => false, :default => 0
User.each { |u| User.reset_counters u, :purchased_deals }
När det väl är ur vägen blir det mycket enklare:
users = User.all :conditions => 'purchased_deals_count > 0'
Rails kommer att hålla kolumnen uppdaterad för dig, med de flesta standardoperationer.
För att få det totala priset kommer alltid att innebära en koppling. Eller så kan du skapa en hash av dealpriser och göra den tråkiga bearbetningen i Ruby. Jag är ingen SQL-expert, men du kan potentiellt bli av med joinen genom att lagra priset med PurchasedDeal. Annars gör du så här med en join:
user_id_to_price = PurchasedDeal.sum 'deal.price', :include => :deal, :group => :user_id
Du kan filtrera det på bara de användare du vill ha genom att lägga till något som :conditions => ['user_id IN (?)', users]
. (Där users
kan vara en lista med ID, men även Användarobjekt.)