Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Rails – Ziehen und berechnen Sie Daten effizient über mehrere Beziehungen hinweg

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.)