sql >> Databasteknik >  >> RDS >> Mysql

Rails - Dra och beräkna data effektivt över flera relationer

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



  1. MySQL-konvertering mellan två datumformat

  2. För att ändra kolumndatatyp från clob till xmltype

  3. Vad gör en SQL-sats sargbar?

  4. Hur utför man IF-satsen i SQL?