跨多个关联查询

时间:2014-02-25 21:07:27

标签: ruby-on-rails ruby-on-rails-4

我有以下课程:

class School
  belongs_to :zipcode
end

class Zipcode
  has_many :schools
  belongs_to :city
end

class City
  has_many :zipcodes
  belongs_to :county
end

class County
  has_many :cities
  belongs_to :state
end

class State
  has_many :counties
end

鉴于国家身份证号,我如何找到所述州内的所有学校?

4 个答案:

答案 0 :(得分:1)

您需要使用带有joins子句的长where

School.joins(zipcode: { city: { county: :state } }).where(states: { id: <STATE_ID> })

答案 1 :(得分:1)

另一种可能的解决方案。如果您使用的是Rails 3.1或更高版本,则可以尝试嵌套has_many :through

class School
  belongs_to :zipcode
end

class Zipcode
  has_many :schools
  belongs_to :city
end

class City
  has_many :zipcodes
  has_many :schools, :through => :zipcodes
  belongs_to :county
end

class County
  has_many :cities
  belongs_to :state
  has_many :schools, :through => :cities
end

class State
  has_many :counties
  has_many :schools, :through => :counties
end

现在你可以说

State.find(<id>).schools

内部触发此查询

  

选择“学校”。*来自“学校”INNER JOIN   “zipcodes”ON“学校”。“zipcode_id”=“zipcodes”。“id”INNER JOIN   “城市”ON“zipcodes”。“city_id”=“城市”。“id”INNER JOIN“县”   ON“cities”。“county_id”=“县”。“id”WHERE“县”。“state_id”   = 1

答案 2 :(得分:0)

我建议使用joins ...类似于:

School.joins(zipcode: { city: { county: :state } }).where("state.id" => <state_id>)

答案 3 :(得分:0)

或者,如果您经常进行此查询,则可以使范围更容易。东西:

scope :where_state_is, ->(state_name) { joins(:zipcode, :city, :county, :state).where("state.name = ?", state_name ) } 

School.where_state_is('NY')