2012-11-29 32 views
10

Tôi có các mô hình Trang và Đoạn có quan hệ has_and_belongs_to_many. Với một paragraph_id, tôi muốn nhận tất cả các trang phù hợp. ví dụ:Hiệu quả ActiveRecord has_and_belongs_to_many truy vấn

pages = Paragraph.find(paragraph_id).pages.all 

Tuy nhiên, điều này có hai truy vấn. Nó có thể được thực hiện trong một truy vấn:

SELECT "pages".* FROM "pages" 
INNER JOIN "pages_paragraphs" ON "pages_paragraphs"."page_id" = "pages"."id" 
WHERE "pages_paragraphs"."paragraph_id" = 123 

Nhưng điều này có thể được thực hiện mà không

  • sử dụng find_by_sql
  • mà không sửa đổi vào bảng page_paragraphs (ví dụ: thêm một id).

Cập nhật:

mô hình trang của tôi trông như thế này:

class Page < ActiveRecord::Base 
    has_and_belongs_to_many :paragraphs, uniq: true 
end 
+0

@jdoe Tôi đã làm rõ câu hỏi của tôi, cảm ơn vì những nỗ lực của bạn. –

+0

Vấn đề với hai truy vấn là gì? Có một ví dụ phức tạp hơn bạn đang cố gắng tối ưu hóa mà chúng ta không nhìn thấy? –

+0

Không, tôi chỉ muốn thực hiện câu lệnh SQL trong câu hỏi của tôi với truy vấn activerecord. –

Trả lời

1

Bạn có thể sử dụng includes cho việc này:

pages = Paragraph.includes(:pages).find(paragraph_id).pages

+4

Điều đó tạo ra 2 truy vấn. –

15

Với has_many: thông qua mối quan hệ, bạn có thể sử dụng điều này:

pages = Page.joins(:pages_paragraphs).where(:pages_paragraphs => {:paragraph_id => 1}) 

Hãy xem Điều kiện Quy định rõ về Tables Tham gia đây: http://guides.rubyonrails.org/active_record_querying.html

Nếu bạn muốn các trang và đoạn văn bản với nhau:

pages = Page.joins(:pages_paragraphs => :paragraph).includes(:pages_paragraphs => :paragraph).where(:pages_paragraphs => {:paragraph_id => 1}) 

Với has_and_belongs_to_many:

pages = Page.joins("join pages_paragraphs on pages.id = pages_paragraphs.page_id").where(["pages_paragraphs.paragraph_id = ?", paragraph_id]) 
+0

'Hiệp hội có tên 'pages_paragraphs' không được tìm thấy ' –

+1

Nếu không có mô hình/liên kết cho bảng pages_paragraphs của bạn, bạn có thể thực hiện điều kiện tham gia dưới dạng chuỗi. Page.joins ("join pages_paragraphs on pages_paragraphs.page_id = pages.id"). Where ("pages_paragraphs.paragraph_id =?", Paragraph_id) –

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