Гнездование "где" в рельсовых ассоциациях - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь сделать что-то похожее на:

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.

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