ActiveRecord. Где находится .join / has_one: through - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть три модели - Patient, Location и Area.

Каждый пациент принадлежит определенному месту, а местоположения принадлежат областям.Области имеют логическое значение, называемое inpatient.

. Мне нужно выбрать пациентов, которые принадлежат к месту, которое, в свою очередь, принадлежит к области со стационарным значением, установленным в true.

У меня естьпробовал следующее, но ничего не работает:

@inpatient = Area.joins(:locations).joins(:patients).where(inpatient: true).count
@inpatient = Patient.joins(:location).join(:area).where(area: {inpatient: true}) 
@inpatient = Patient.joins(:area).where(area: {inpatient: true}).all 
@inpatient = Patient.joins(:location).joins(:area).where(area: {inpatient: true}).count

Был бы признателен за помощь!Я полагаю, что это просто и что я что-то неправильно понимаю ... Я посмотрел на другие вопросы, которые похожи, но не смог перенаправить ответы во что-то, что работает.


МОДЕЛИ

class Patient < ApplicationRecord

  belongs_to :location, optional: true
  has_one :area, through: :location

end

-

class Location < ApplicationRecord

  has_many :patients
  belongs_to :area, optional: false

end

-

class Area < ApplicationRecord

  has_many :locations
  has_many :patients, through: :locations

end

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вы можете использовать свои ассоциации, он должен выдавать тот же SQL-запрос, но он более прост и удобочитаем

@inpatient = Area.where(inpatient: true).patients
0 голосов
/ 03 февраля 2019

Вы рядом.Вы должны использовать имена таблиц в операторе where, а НЕ имя отношения.Кроме того, вы должны использовать области в аргументе location.Попробуйте это:

@inpatient = Patient.joins(:location).joins(:area).where(locations: {areas: {inpatient: true}}) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...