2016-04-01 3 views
0

Ich habe eine Seite, die mehr als 300 Jobs für ein Cabinetry Builder/Installer lädt. Ich lade alle ihre aktiven Jobs auf eine Seite, pro Fabrik, von denen sie drei haben - Dallas, Arlington und Aubrey. Jede Fabrik hat 300 bis 400 aktive (geplante, nicht installierte Aufträge).Der Versuch, mehrere SQL-Abfragen in Rails App zu beheben

Also, wenn ich die Dallas-Seite laden, gehe ich jeden Tag über und gebe die Aufträge in Reihenfolge für diesen Tag aus. Die Abfragen wiederholen sich für ungefähr 50 Tage. Ich möchte wissen, ob ich diese Informationen irgendwie an den Cache senden kann.

Hier ist ein Bild von dem, was ein paar Tage aussehen ...

partial results pictured

Für jeden Tag I 2 SUM-Abfragen für den Header zu machen, und eine weitere Abfrage Aufträge für diesen bestimmten Tag zu filtern, dh , @jobs.where(calendar_date: '2016-04-06').each do

Hier sind die genauen Abfragen

# ALL jobs (in the controller) 
@jobs = Job.where(active: true, scheduled: true, 
       manufacturing_location: session[:factory]). 
       includes(:installer). 
       order('calendar_date asc') 

# Jobs for one day (in the view 
@jobs.where(calendar_date: day).order(:calendar_order).each do 

# The helper method for the 'daily tabulations' in the header 
    = daily_tabulation(@jobs.where(calendar_date: day)) 

    def daily_tabulation(jobs) 
    total_boxes = jobs.sum :number_of_cabinets 
    complete = jobs.where(complete_in_shop: true).sum :number_of_cabinets 
    to_build = total_boxes - complete 
    "To Build: #{to_build}, Complete: #{complete}, Total Boxes: #{total_boxes}" 
    end 

Diese Seiten 4 nehmen bis zu 7 Sekunden in den Browser geladen werden, auch mit Redis-Fragment-Caching. Zugegeben, jeder dieser über 300 Jobs bekommt JS-Event-Handler, um die Jobs per Drag-and-Drop zu verschieben, genauso wie JS-Tooltips, aber ich hoffe, dass ich diese Abfragen bereinigen und eine Sekunde oder mehr von der Reaktionszeit. Vielen Dank.

Antwort

1

Da Sie mit einer Sammlung in diesem Fall arbeiten, können Sie einmal Ihre jobs laden und es dann wie Array verarbeiten:

@job_by_day = @jobs.select { |j| j.calendar_date == day } 

Und verwenden Enumerable#sort statt AR#order.