spi*_*109 31 sql join ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2
在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
Run Code Online (Sandbox Code Playgroud)
我觉得我想要某种雇主加入some_city.people,但我不知道如何做到这一点.如果人们直接属于城市,我可以将雇主加入到city_id所属的人群中,但我希望在没有直接加入的情况下找到相同的数据,我有点迷失.
谢谢.
jva*_*ans 42
使用嵌套连接
Employer.joins({:people => {:household => {:suburb => :city}}})
Run Code Online (Sandbox Code Playgroud)
应该给你你正在寻找的联接表.如果您正在遍历另一个方向,则使用复数名称
City.joins( :suburbs => {:households => {:people => :employers }})
Run Code Online (Sandbox Code Playgroud)
Sea*_*ill 20
你可以像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
Run Code Online (Sandbox Code Playgroud)
然后,你可以加入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
Run Code Online (Sandbox Code Playgroud)