2010-01-23 12 views
0

J'espérais que je pourrais obtenir de l'aide d'optimiser cette requête pour un site rails:Besoin d'aide pour optimiser cette base de données requête

Vacation 
has_many :departures 
has_many :photos 

Departure 
belongs_to :vacation 

Photo 
belongs_to :vacation 

Je dois trouver une liste de vacances commandés et affichés par le départ. Donc, si un voyage a deux départs, il devrait apparaître deux fois dans la liste (une fois par départ).

@dates = Departure.find(:all, 
         :order => "start_at", 
         :include => [{:vacation => :photos}], 
         :conditions => ["vacations.duration > 1 AND start_at > ?", Time.now]) 

Le problème est que je alors besoin de rassembler tous les départs à venir pour chaque vacances, qui se traduit par une nouvelle requête pour chaque départ indiqué.

Des idées sur comment mieux accomplir cela?

Répondre

0

Vous n'avez pas de limite sur cette requête, donc n'avez-vous pas déjà tout ce dont vous avez besoin en mémoire? Vous avez un tableau avec chaque départ futur pour chaque vacances que vous souhaitez afficher.

Utilisez donc la baie que vous avez déjà.

vacation_id = 3 # Or whatever - this would obviously be in a loop. 
@dates_for_vacation = @dates.select{|d| d.vacation_id == vacation_id} 
0

Je pense que vous pouvez récupérer les données via une requête sur les vacances, plutôt que sur les départs.

@vacations = Vacation.find(:all, 
        :order => "departures.start_at", 
        :include => [:departure, :photos], 
        :conditions => ["vacations.duration > 1 AND departures.start_at > ?", Time.now]) 

Ce trouvera toutes les vacances pour la période de temps, mais aussi charger les dossiers de départ et photo associée, ce qui réduit considérablement la charge de la requête.

Vous devrez peut-être jouer avec la requête pour obtenir les bons enregistrements de départ.

+0

Ceci saisit les vacances et les commande correctement, mais n'affichera pas les vacances pour chaque départ, juste le premier il semble. Je vais jouer plus et voir si je peux le faire fonctionner comme j'en ai besoin. – Ryan

+0

Parfois, je descends directement dans SQL pour obtenir une requête comme celle-ci, puis je l'inverse dans l'enregistrement actif dsl ... peut être beaucoup plus simple lors de la navigation de plusieurs jointures et conditions. –

Questions connexes