has_many через ассоциации, где и выберите результаты - PullRequest
2 голосов
/ 01 июня 2019

Итак, я пытаюсь отфильтровать результаты, используя условие WHERE, но оно не работает.

class Physician < ApplicationRecord
  has_many :appointments
  has_many :patients, through: :appointments
 end

class Appointment < ApplicationRecord
  belongs_to :physician
  belongs_to :patient
 end

class Patient < ApplicationRecord
  has_many :appointments
  has_many :physicians, through: :appointments
end

и что я здесь делаю:

patients = Patient.joins(:physicians).includes(:physicians).where(:appointments => {:sick => true })

Тем не менее, я получаю следующее:

"results": {
  "patient": {
    "id": 2,
    "patient_name": "Rob"
   },
   "physicians": [
    {
      "id": 4,
      "physicians_name":...
      "sick":false
    ... ,
    {
      "id": 7,
     "physicians_name":...
     "sick":true
     ... 
     ... ,
      {
      "id": 7,
      "physicians_name":...
      "sick":false
     ... 
     ]
    }

Итак, как вы заметили, я НЕ принимаю только врачей с больными = правда. какие-либо предложения?

Обновление : Это мой сериализатор

class PatientSerializer < ActiveModel::Serializer
  attributes :records

 def records
    { info: records_info }
 end

 def records_info
  object.appointments.map do |a|
  a.attributes.merge(a.physician.attributes)
 end

конец конец

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Поскольку атрибут sick хранится в appointment, вы должны joins(:appointments) вместо joins(:physicians).

Учитывая это, это должно вернуть результаты, которые вы ищете:

patients = Patient.joins(:appointments).includes(:physicians).where(appointments: { sick: true })

Причина этого заключается в том, что условия в предложении where должны ссылаться на объединенные таблицы. Поскольку таблица physicians не используется в предложении where, ее не нужно явно объединять; однако таблица appointments должна быть явно объединена.

includes(:physicians) разрешает «энергичную загрузку» записей physicians, что предотвращает превращение этого запроса в N + 1 при доступе к данным каждого врача в сериализаторе.

1 голос
/ 01 июня 2019

Я полагаю, includes(:physicians) вызывает энергичную загрузку, из-за чего условие where не работает должным образом. Можете ли вы вынуть его и посмотреть, исправит ли это? Вы можете прикрепить это в конце и видеть, помогает ли это также.

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