0

У меня есть 3 модели: Кино, Кино и Бег. Кино и кино имеют отношение через Run, например так:Невозможно найти лучший способ отображения объединенных данных в Rails 5 с has_many_through отношением

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

Я пытаюсь отобразить список кинотеатров определенного фильма со списком серий для каждого кино:

Movie 1

  1. Cinema 1
    • 12:30
    • 15:00
  2. Cinema 2
    • 15:30
    • 16:00

Я не могу понять, как уменьшить обращений к базе данных. Прямо сейчас я звоню каждому кино, поэтому его пропорционально количеству или кинотеатрам. Разве это не кажется мне правильным

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

Нужна помощь с этим

ответ

0

Вы можете добавить отношения к Run первой

class Run < ApplicationRecord 
    belongs_to :movie 
    belongs_to :cinema 
end 

Затем используйте includes и запустить цикл из runs.

Например:

@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 

Обратите внимание, что

runs.group_by(&:cinema_id) 

представляет собой синтаксис сахар

runs.group_by{|run| run.cinema_id } 

пример использования метода group_by:

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

А как насчет списка кинотеатров? – kabukiman

+0

вы можете использовать 'runs.first.cinema' –

+0

извините, я ошибся его как' runs.first.movie' –