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に参加したいのですが、これを行う方法がわかりません。人々が都市に直接属していた場合、Employerをcity_idが何かである人々に参加させることができますが、その直接参加なしで同じデータを見つけたいので、少し迷います。
ありがとうございました。
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
ネストされた結合を使用する
Employer.joins({:people => {:household => {:suburb => :city}}})
探している結合テーブルが表示されます。他の方向に移動する場合は、複数の名前を使用します
City.joins( :suburbs => {:households => {:people => :employers }})