ActiveRecord: как выполнять вложенные запросы по внешним ключам?

#ruby-on-rails #activerecord

#ruby-on-rails #activerecord

Вопрос:

У меня есть 3 модели: «Тренер», «Команда» и «Событие»

Событие имеет атрибуты away_team и home_team, оба из которых принадлежат Team. Команда принадлежит тренеру, а у тренера может быть много команд.

Что я хотел бы сделать, так это найти все события, где home_team не тренируется конкретным тренером. Итак, что-то вроде:

 Event.where("home_team.team.coach_id NOT ?", coach.id)
  

Проблема заключается в том, чтобы выяснить, как записать этот синтаксис. Я предполагаю, что мне нужно включить модель «team», но я не уверен, как написать activerecord include, который присоединяется через определенный внешний ключ.

Короче говоря, я был бы очень признателен за любые идеи о том, как это сделать без ошибок SQL (которых у меня было бесчисленное количество сегодня вечером).

Приветствия.

Ответ №1:

Если я правильно вас понимаю, вам нужен такой sql:

 SELECT events.* FROM events JOIN team on events.home_team_id = teams.id WHERE teams.coach_id != coach_id
  

итак, в rails это должно выглядеть примерно так:

 Event.joins("join teams on events.home_team_id = teams.id").where("teams.coach_id != ?", coach_id)
  

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

Если у вас есть в модели событий ассоциация: belogns_to: home_team, вы можете использовать только объединения (:home_team).где (….)