Подтвердить что ты не робот

Rails объединяется через ассоциацию

В Ruby on Rails я хочу найти работодателей в городе. Допустим, что модели настроены таким образом:

City
has_many :suburbs
has_many :households, :through => suburbs
has_many :people, :through => suburbs

Suburb
has_many :households
has_many people, :through => households
belongs_to :city


Household
has_many :people
belongs_to :suburb

People
belongs_to :household
belongs_to :employer


Employer
has_many :people

Мне кажется, что я хочу, чтобы какой-то работодатель присоединился к some_city.people, но я не знаю, как это сделать. Если бы люди принадлежали напрямую к городам, я мог бы присоединиться к Работодателю людям, где city_id - это что-то, но я хочу найти те же данные без этого прямого соединения, и я немного потерял.

Спасибо.

4b9b3361

Ответ 1

Вы можете сделать соединение, как показано на jvans. Или вы можете настроить свои отношения следующим образом:

class Employer < ActiveRecord::Base
  has_many :people
  has_many :households, through: :people
  has_many :suburbs, through: :households
  has_many :cities, through: :suburbs
end

class Person < ActiveRecord::Base
  belongs_to :household
  belongs_to :employer
end


class Household < ActiveRecord::Base
  belongs_to :suburb
  has_many :people
end

class Suburb < ActiveRecord::Base
  belongs_to :city
  has_many :households
  has_many :people, through: :households
end

class City < ActiveRecord::Base
  has_many :suburbs
  has_many :households, through: :suburbs
  has_many :people, through: :households
  has_many :employers, through: :people
end

Затем вы можете присоединиться City от Employer и наоборот.

Например:

Employer.joins(:cities).where("cities.name = ?", "Houston").first

SELECT "employers".* FROM "employers" 
INNER JOIN "people" ON "people"."employer_id" = "employers"."id" 
INNER JOIN "households" ON "households"."id" = "people"."household_id" 
INNER JOIN "suburbs" ON "suburbs"."id" = "households"."suburb_id" 
INNER JOIN "cities" ON "cities"."id" = "suburbs"."city_id" WHERE (cities.name = 'Houston') 
LIMIT 1

Ответ 2

Использовать вложенные соединения

Employer.joins({:people => {:household => {:suburb => :city}}}) 

должен предоставить вам таблицу соединений, которую вы ищете. Если вы проходили другое направление, вы бы использовали множественные имена

City.joins( :suburbs => {:households => {:people => :employers }})