0

J'ai 3 modèles: Cinéma, Film et Exécuter. Cinéma et vidéo a une relation Courons, comme ceci:Impossible de trouver le meilleur moyen d'afficher les données jointes dans Rails 5 avec la relation has_many_through

class Movie < ApplicationRecord 
    has_many :cinemas, -> { distinct }, through: :runs 
    has_many :runs 
end 

Je suis en train d'afficher la liste des cinémas de certains films avec la liste des pistes pour chaque cinéma:

Film 1

  1. Cinéma 1
    • 12:30
    • 15:00
  2. Cinéma 2
    • 15:30
    • 16:00

Je ne peux pas comprendre comment réduire les appels de base de données. En ce moment je fais un appel pour chaque cinéma, donc c'est proportionnel pour le nombre ou les cinémas. Est-ce que ne me semble juste

@movie.cinemas.each do |cinema| 
    cinema.runs.where(movie_id: @movie.id).each do |run| 
     = run.time 

Besoin d'aide avec cette

Répondre

0

Vous devrez peut-être ajouter à la relation Run premier

class Run < ApplicationRecord 
    belongs_to :movie 
    belongs_to :cinema 
end 

Utilisez ensuite includes et commencer la boucle de runs.

Par exemple:

@movie = Movie.where(... the condition ...).includes(:runs => :cinemas).first 
@movie.runs.group_by(&:cinema_id).each do |movie_id, runs| 
    <%= runs.first.cinema.name %> 
    runs.each do |run| 
    <%= run.time %> 
    end 
end 

Notez que

runs.group_by(&:cinema_id) 

est un sucre de syntaxe de

runs.group_by{|run| run.cinema_id } 

L'exemple d'utilisation de la méthode group_by:

(1..6).group_by {|i| i%3} #=> {0=>[3, 6], 1=>[1, 4], 2=>[2, 5]} 
+0

Mais qu'en est-il de la liste des cinémas? – kabukiman

+0

vous pourriez utiliser 'runs.first.cinema' –

+0

désolé, j'ai mal tapé comme' runs.first.movie' –