У меня есть следующие две модели в приложении Rails
class Students < ApplicationRecord
has_many :courses
attr_accessor :name
end
class Courses < ApplicationRecord
has_many :students
attr_accessor :name, :course_id
end
Я хотел бы получить список всех курсов, общих для каждого студента, который был в одном классе с выбранным студентом эффективным способом .
С учетом следующих студентов:
Jerry's courses ["math", "english", "spanish"]
, Bob's courses ["math", "english", "french"]
, Frank's courses ["math", "basketweaving"]
Harry's courses ["basketweaving"]
Если выбранный студент был Джерри, я бы хотел, чтобы следующий объект был возвращен
{ Bob: ["math", "english"], Frank: ["math"] }
Я знаю, что это будет дорогостоящая операция, но моя интуиция говорит мне, что есть лучший способ, чем то, что я делаю. Вот что я попробовал:
# student with id:1 is selected student
courses = Student.find(1).courses
students_with_shared_classes = {}
courses.each do |course|
students_in_course = Course.find(course.id).students
students_in_course.each do |s|
if students_with_shared_classes.key?(s.name)
students_with_shared_classes[s.name].append(course.name)
else
students_with_shared_classes[s.name] = [course.name]
end
end
end
Есть ли какие-нибудь трюки ActiveRecord или SQL для такой ситуации?