ActiveRecord .where的.join / has_one:through

时间:2019-02-03 19:45:44

标签: ruby-on-rails ruby activerecord

我有三个模型-PatientLocationArea

每个患者都属于一个位置,而每个位置都属于区域。 区域具有一个布尔值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 :(得分:3)

您很近。您必须在where语句中使用表名,而不是关系名。同样,您必须使用locations参数内的区域。试试这个:

@inpatient = Patient.joins(:location).joins(:area).where(locations: {areas: {inpatient: true}}) 

答案 1 :(得分:0)

您可以使用关联,它应该产生相同的SQL查询,但是更简单易读

@inpatient = Area.where(inpatient: true).patients