2013-04-20 9 views
22

In Ruby on Rails möchte ich Arbeitgeber in der Stadt finden. Können sagen die Modelle auf diese Weise eingerichtet:Schienen verbindet durch Assoziation

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 

Ich fühle mich wie eine Art von Arbeitgeber verbindet some_city.people will, aber ich weiß nicht, wie dies zu tun. Wenn Leute direkt zu Städten gehören, könnte ich Arbeitgeber zu Leuten beitreten, wo city_id etwas ist, aber ich möchte die gleichen Daten ohne diese direkte Verbindung finden, und ich bin ein wenig verloren.

Vielen Dank.

+0

Versuchen Sie, diese in Schienen zu tun? Warum nicht einfach ihre Hilfsmethoden verwenden? – Steve

+0

Es tut mir leid, welche Hilfsmethode würdest du dafür empfehlen? – spitfire109

+0

Warum durchquerst du nicht die Beziehungen über 'has_many: through' von' Employer', wie du es von 'City' machst? –

Antwort

15

Sie können tun, verbinden die wie jvans dargestellt hat. Oder Sie können Setup Ihre Beziehungen wie folgt aus:

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 

Dann können Sie City von Employer verbinden, und umgekehrt, direkt.

Zum Beispiel:

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, mir war gar nicht bewusst, dass ich diese Art von Assoziation herstellen könnte ich gehe das umsetzen, Ich vermute, dass dies genau die Antwort ist, nach der ich suche, um zukünftige ähnliche Fragen und ähnliches zu erarbeiten. – spitfire109

+0

Ja, ab Rails 3.1 funktionieren die geschachtelten 'has_many: through' Beziehungen recht gut. –

31

Verwendung verschachtelt verbindet

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

sollten Sie die Tabelle suchen Sie verbinden geben. Wenn Sie die andere Richtung wurden durchqueren würden Sie mehrere Namen verwenden

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

Okay, ich denke, das ist, worum ich gefragt habe. Um die Syntax zu verdeutlichen, wie würde diese letzte Verbindung zur Identifizierung einer bestimmten Stadt hergestellt? Angenommen, ich möchte alle Arbeitgeber finden, die Leute aus Chicago beschäftigen, die eine Model ID von 1 haben? – spitfire109

+1

Fügen Sie eine Where-Klausel hinzu .where ("Arbeitgeber.city IN? UND Arbeitgeber.ID in?, Stadt, ID) – jvans

+1

Auch fwiw Ich schreibe ein Juwel namens searchlogic mit aktiven Datensatz 3 arbeiten und sollte bald getan werden. Es macht Suchvorgänge wie diese in Ihrer App ziemlich trivial. Https://github.com/binarylogic/searchlogic?source=cr – jvans

Verwandte Themen