2013-04-20 6 views
22

В 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 - это что-то, но я хочу найти те же данные без этого прямого соединения, и я немного потерялся.

спасибо.

+0

Вы пытаетесь сделать это в рельсах? Почему бы просто не использовать их вспомогательные методы? – Steve

+0

Извините, какой вспомогательный метод вы бы рекомендовали для этого? – spitfire109

+0

Почему вы не проходите отношения через 'has_many: through' от' Employer', как вы делаете из 'City'? –

ответ

15

Вы можете сделать присоединиться как 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 
+0

Wow. Я совершенно не знал, что смогу сделать такую ​​ассоциацию. я иду реализовать это, Я подозреваю, что это именно тот ответ, который я ищу для разработки будущих похожих запросов и т. Д. – spitfire109

+0

Да, с Rails 3.1 вложенные отношения 'has_many: through' работают довольно хорошо. –

31

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

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

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

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

Хорошо, я думаю, это то, о чем я просил. Просто, чтобы прояснить синтаксис, как будет создана эта заключительная ассоциация для идентификации определенного города? Скажем, я хочу найти всех работодателей, которые нанимают людей из Чикаго, у которых есть идентификатор модели 1? – spitfire109

+1

Добавить место где-то там. «(Работодатели.city IN? AND employ.id in?, City, id) – jvans

+1

Также fwiw Я переписываю драгоценный камень под названием searchlogic для работы с активной записью 3 и должен быть сделан в ближайшее время. Это делает так, что поиск в этом приложении довольно тривиален. Https://github.com/binarylogic/searchlogic?source=cr – jvans