Um eine Liste der Benutzer-IDs mit mehr als einem Kauf zu erhalten, können Sie wie folgt vorgehen, wodurch nur auf eine Tabelle zugegriffen wird:
user_ids = PurchasedDeal.count(:group => :user_id, :having => 'count_all > 0').keys
Anschließend können Sie alle diese Benutzer abrufen mit:
users = User.find user_ids
Die Dinge können mit einem Zähler-Cache beschleunigt werden. Fügen Sie in Ihrem Benutzermodell die Option :counter_cache => true
hinzu zu has_many
Verband für gekaufte Deals. Sie benötigen eine zusätzliche Integer-Spalte in Ihrer Benutzertabelle und müssen initialisieren, was bei einer Migration wie folgt aussehen könnte:
add_column :users, :purchased_deals_count, :integer, :null => false, :default => 0
User.each { |u| User.reset_counters u, :purchased_deals }
Sobald das erledigt ist, wird es viel einfacher:
users = User.all :conditions => 'purchased_deals_count > 0'
Rails hält die Kolumne mit den meisten Standardoperationen für Sie auf dem neuesten Stand.
Um den Gesamtpreis zu erhalten, ist immer ein Beitritt erforderlich. Oder Sie können einen Hash von Deal-Preisen erstellen und die mühsame Verarbeitung in Ruby durchführen. Ich bin kein SQL-Experte, aber Sie können den Join möglicherweise loswerden, indem Sie den Preis mit PurchasedDeal speichern. Ansonsten, hier ist, wie man es mit einem Join macht:
user_id_to_price = PurchasedDeal.sum 'deal.price', :include => :deal, :group => :user_id
Sie können dies nur auf die gewünschten Benutzer filtern, indem Sie etwas wie :conditions => ['user_id IN (?)', users]
hinzufügen . (Wobei users
kann eine Liste von IDs sein, aber auch Benutzerobjekte.)