2013-04-21 38 views
17

Làm thế nào để tôi viết dưới đây truy vấn mysql vào đường ray activerecordNhiều bảng tham gia trong đường ray

select A.*, B.* from raga_contest_applicants_songs AS A 
    join raga_contest_applicants AS B 
    ON B.contest_applicant_id=A.contest_applicant_id 
    join raga_contest_rounds AS C ON C.contest_cat_id=B.contest_cat_id 
    WHERE C.contest_cat_id = contest_cat_id 
    GROUP BY C.contest_cat_id 

tôi biết làm thế nào để viết tham gia vào hai bảng, không phải là rất tự tin về cách sử dụng tham gia vào 3 bảng.

Trả lời

53

Để viết lại truy vấn SQL bạn có trong câu hỏi của mình, tôi nghĩ nó giống như sau (mặc dù tôi đang gặp khó khăn trong việc hình dung đầy đủ mối quan hệ mô hình của bạn, vì vậy đây là một chút phỏng đoán):

RagaContextApplicantsSong. 
    joins(:raga_contest_applicants => [:raga_content_rounds], :contest_cat). 
    group('raga_contest_rounds.contest_cat_id') 

... như vậy mà các phương pháp joins sẽ chăm sóc của cả hai tham gia cũng như WHERE khoản, sau đó cuối cùng bởi group gọi.

Khi ngày càng nhiều để tham khảo:

Nếu bạn đang tham gia nhiều hiệp hội với cùng mô hình you can simply list them:

Post.joins(:category, :comments) 
Returns all posts that have a category and at least one comment 

Nếu bạn đang tham gia bảng lồng nhau, bạn có thể liệt kê chúng như trong một hash :

Post.joins(:comments => :guest) 
Returns all comments made by a guest 

Kết hợp lồng nhau, nhiều cấp:

Category.joins(:posts => [{:comments => :guest}, :tags]) 
Returns all posts with their comments where the post has at least one comment made by a guest 

Bạn cũng có thể chuỗi ActiveRecord Query Interface gọi như vậy:

Post.joins(:category, :comments) 
...produces the same SQL as... 
Post.joins(:category).joins(:comments) 

Nếu vẫn thất bại, bạn có thể luôn luôn pass a SQL fragment directly into the joins method như một bước đệm để nhận được từ truy vấn làm việc của bạn để một cái gì đó hơn ARQI trung tâm

Client.joins('LEFT OUTER JOIN addresses ON addresses.client_id = clients.id') 
=> SELECT clients.* FROM clients LEFT OUTER JOIN addresses ON addresses.client_id = clients.id 
+2

cảm ơn rất nhiều nỗ lực bạn đã thực hiện để giải thích chi tiết mà không có nhiều thông tin được đề cập. Tôi mới đến đường ray, sau khi làm việc trong .net trong 6 năm tôi thực sự có thời gian khó khăn để mã đường ray, nhưng giúp đỡ từ những kẻ như bạn giữ cho tôi đi .. cảm ơn một lần nữa .. – pramodtech

+1

niềm vui của tôi. Chào mừng bạn đến với cộng đồng Rails. Như người Ruby muốn nói [MINSWAN] (http://blog.steveklabnik.com/posts/2011-08-19-matz-is-nice-so-we-are-nice) – jefflunt

+1

Liên kết lồng nhau, nhiều cấp # => wizardry Sử dụng cú pháp băm đơn giản 'Category.joins (bài đăng: [{comments:: guest},: tags])' – Epigene

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