For at få en liste over bruger-id'er med mere end ét køb kan du gøre følgende, som kun vil få adgang til én tabel:
user_ids = PurchasedDeal.count(:group => :user_id, :having => 'count_all > 0').keys
Efterfølgende kan du hente alle disse brugere med:
users = User.find user_ids
Tingene kan fremskyndes med en tællercache. Tilføj muligheden :counter_cache => true
i din brugermodel til has_many
forening for købte handler. Du skal bruge en ekstra heltalskolonne på din brugertabel og initialisere, som kan se ud som følger 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 er af vejen, bliver det meget enklere:
users = User.all :conditions => 'purchased_deals_count > 0'
Rails vil holde kolonnen opdateret for dig med de fleste standardoperationer.
For at få den samlede pris vil det altid indebære en joinforbindelse. Eller du kan bygge en hash af aftalepriser og lave den kedelige behandling i Ruby. Jeg er ingen SQL-ekspert, men du kan potentielt slippe af med joinforbindelsen ved at gemme prisen med PurchasedDeal. Ellers gør du sådan her med et join:
user_id_to_price = PurchasedDeal.sum 'deal.price', :include => :deal, :group => :user_id
Du kan filtrere det på netop de brugere, du ønsker, ved at tilføje noget såsom :conditions => ['user_id IN (?)', users]
. (Hvor users
kan være en liste over ID'er, men også brugerobjekter.)