включается на столы без отношения в рельсах - PullRequest
0 голосов
/ 02 июля 2019

Как обходится невозможность использования joins для таблиц, которые не имеют отношения?

например:

class Student
end

class Lesson
end

Нет явной корреляции между Студентом и Уроком, однако в БД у нас есть неявная корреляция: Students.lesson_id и courses.id.

Используя чистый SQL, можно объединить эти две таблицы, однако, используя joins, предоставляемый rails следующим образом:

Student.joins(:lesson).where('student.lesson_id=lesson.id')

выбросит «Ассоциация с именем« урок »не найдена на ученике; возможно, вы ошиблись?»

Я ищу обходной путь со следующими требованиями:

  • Для повышения эффективности идеально подходит использование запросов к СУБД. (Rails sort_by, find и т. Д. Не являются)
  • Для улучшения читабельности необработанный SQL не идеален.

Есть ли где-нибудь работа вокруг? Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

:lesson в joins(:lesson) должно быть именем отношения, определенного в Student модель:

class Student < ApplicationRecord
  belongs_to :lesson
end

Тогда вы можете переписать ваш запрос как:

Student.joins(:lesson).all

НО это приводит к N + 1 запросам на случай, если вам нужен доступ к Lesson:

students = Student.joins(:lesson).all
lesson_name = students.first.lesson.name

Чтобы избежать этого, используйте includes вместо:

Student.includes(:lesson).all

Вы можете (должны) добавить отношение контрагента к Lesson:

class Lesson < ApplicationRecord
  has_many :students
end

Кстати, вы можете использовать строки в соединении:

Student.joins('join lessons on students.lesson_id = lessons.id')
0 голосов
/ 02 июля 2019

Метод активной записи .joins уже включается по внешнему ключу. Нет необходимости указывать это снова в операторе where. Вы можете использовать where для фильтрации полученных результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...