2013-04-20 33 views
22

Trong Ruby on Rails, tôi muốn tìm nhà tuyển dụng trong thành phố. phép nói rằng các mô hình được thiết lập theo cách này:Đường ray tham gia thông qua liên kết

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 

Tôi cảm thấy như tôi muốn một số loại của nhà tuyển dụng tham gia some_city.people nhưng tôi không biết làm thế nào để làm điều này. Nếu mọi người thuộc về thành phố, tôi có thể gia nhập Employer với những người mà city_id là một thứ gì đó, nhưng tôi muốn tìm cùng một dữ liệu mà không có sự tham gia trực tiếp đó và tôi đã mất một chút.

Cảm ơn bạn.

+0

Bạn đang cố gắng để làm điều này trong đường ray? Tại sao không chỉ sử dụng phương pháp trợ giúp của họ? – Steve

+0

Tôi xin lỗi, bạn sẽ giới thiệu phương pháp trợ giúp nào cho điều này? – spitfire109

+0

Tại sao bạn không đi qua các mối quan hệ qua 'has_many: through' từ' Employer' như bạn đang làm từ 'City'? –

Trả lời

15

Bạn có thể thực hiện việc tham gia như jvans đã minh họa. Hoặc bạn có thể thiết lập các mối quan hệ của bạn như sau:

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 

Sau đó, bạn có thể tham gia City từ Employer, và ngược lại, trực tiếp.

Ví dụ:

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, tôi hoàn toàn không biết mình có thể tạo ra loại liên kết đó. tôi thực hiện điều này, Tôi nghi ngờ đây chính xác là câu trả lời tôi đang tìm kiếm để tìm ra các truy vấn và nội dung tương tự trong tương lai. – spitfire109

+0

Vâng, như của Rails 3.1, các mối quan hệ 'has_many: through' lồng nhau hoạt động khá tốt. –

31

Sử dụng lồng nhau tham gia

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

nên cung cấp cho bạn bảng tham gia bạn đang tìm kiếm. Nếu bạn đang đi qua hướng khác, bạn sẽ sử dụng tên số nhiều

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

Được rồi, tôi nghĩ đây là những gì tôi đã hỏi. Chỉ cần làm rõ cú pháp, làm thế nào để kết hợp cuối cùng đó để xác định một thành phố cụ thể? Giả sử tôi muốn tìm tất cả các nhà tuyển dụng sử dụng người ở Chicago, có ID mẫu là 1? – spitfire109

+1

Thêm mệnh đề where vào nó ở đâu ("employers .ity IN? AND employers.id in?, Thành phố, Id) – jvans

+1

Ngoài ra fwiw tôi đang viết lại một gem gọi là searchlogic để làm việc với bản ghi hoạt động 3 và nên được thực hiện sớm. Nó làm cho việc tìm kiếm như thế này trong ứng dụng của bạn khá tầm thường. Https://github.com/binarylogic/searchlogic?source=cr – jvans

Các vấn đề liên quan