Запрос Rails из трех моделей с использованием соединений

У меня есть следующие модели в моем приложении Rails:

class Test
    has_many :tests_profiles
    has_many :class_profiles

class TestsProfile
    belongs_to :class_profile
    belongs_to :test

class ClassProfile
    has_many :tests_profiles

Я должен запросить tests, принадлежащий конкретному ClassProfile. Моя текущая вспомогательная функция выглядит так:

def get_tests(class_profile)
        return Test.joins(:tests_profiles).where(tests_profiles: {class_profile_id: class_profile.id})

В моем файле erb я просматриваю результат следующим образом:

<% tests = get_tests(class_profile) %>
    <% tests.each do |test| %>
        <th><%= test.name %></th>
    <% end %>

Но проблема в том, что я получаю имена всех тестов, а не только те, которые связаны с этим конкретным ClassProfile. Как я могу исправить его, чтобы он работал так, как я хочу?

«тесты, принадлежащие конкретным ClassProfile» — похоже, все, что вам нужно, это class_profile.tests.

Marek Lipka 30.05.2019 12:13

Я хочу запросить его у TestProfile. Как я могу это сделать?

Lax_Sam 30.05.2019 12:23

Я отредактировал вопрос сейчас.

Lax_Sam 30.05.2019 12:24

Я вообще не понимаю вашу модель данных. Вы связали Test многие с одним с ClassProfile?

Marek Lipka 30.05.2019 12:34

да. Test может быть много ClassProfiles, как один и тот же тест для разных разделов одного класса или класса в школе. TestProfile как предметы. Таким образом, в тесте может быть много предметов. Точно так же у ClassProfile может быть много TestProfiles. Вот какой должна быть моя модель данных. Если в вопросе есть что-то не так с моей моделью данных, сообщите мне.

Lax_Sam 30.05.2019 12:53

У вас где-то опечатка - has_many :tests_profiles но class TestProfile. Обратите внимание на разницу между test и tests, она должна быть одинаковой для обоих случаев.

Vasilisa 31.05.2019 08:25

Да. Я понял. В вопросе была опечатка. Изменил!

Lax_Sam 04.06.2019 08:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
463
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать has_many through здесь:

class Test
    has_many :tests_profiles
    has_many :class_profiles, through: :tests_profiles

class TestsProfile
    belongs_to :class_profile
    belongs_to :test

class ClassProfile
    has_many :tests_profiles
    has_many :tests, through: :tests_profiles

и используйте class_profile.tests.each do в представлении

Другие вопросы по теме