Я пытаюсь сделать что-то похожее на:
Exam.where(students: {schools: {school_name: "Hello World"}})
но я не могу заставить это работать. Вот мои настройки модели.
class School < ApplicationRecord
has_many :students
end
.
class Student < ApplicationRecord
belongs_to :school
has_many :exams
end
.
class Exam < ApplicationRecord
belongs_to :student
end
Я могу без проблем пройти один слой вверх, например:
Exam.where(students: {school_id: 9})
но я не могу подняться еще на один слой и получить названия школ. Как я могу сделать это на основе того, что у меня есть до сих пор? Я пытаюсь начать с модели Exam
именно потому, что ajax-datatables-rails использует результат этого и вызывает exam
атрибуты.
EDIT
Таким образом, ответ Себастьяна решает мои проблемы, но теперь я пытаюсь получить доступ к StudentLicense, который принадлежит Student, и не могу этого сделать, потому что мой начальный joins
не включает student_license
.
Он попадает в первую функцию здесь:
class ExamDatatable < AjaxDatatablesRails::ActiveRecord
def view_columns
@view_columns ||= {
student_name: {source: "Student.name"},
exam_name: {source: "Exam.name"},
license_num: {source: "StudentLicense.license_num"},
}
end
def data
records.map do |record|
{
student_name: record.student.name,
exam_name: record.name,
license_num: record.student_licenses.length
}
end
end
def get_raw_records
Exam.joins(student: :school).where(schools: { school_name: 'Hello World' })
end
end
Теперь, если я сделал что-то вроде этого:
Exam.joins (ученик: [: student_licenses,: school]). Где (школы: {school_name: 'Hello World'})
Я бы получил дубликаты, потому что Student
имеет много student_licenses
.