Đây không chỉ là câu hỏi "tại sao mọi thứ hoạt động theo cách này" chứ không phải là câu hỏi "Tôi không biết làm thế nào" ...
Vì vậy, phúc âm về việc kéo các bản ghi liên quan mà bạn biết bạn sẽ sử dụng là để sử dụng :include
vì bạn sẽ tham gia và tránh một loạt các truy vấn bổ sung:
Post.all(:include => :comments)
Tuy nhiên, khi bạn nhìn vào nhật ký, không có sự tham gia nào xảy ra:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
Nó đang sử dụng một phím tắt bởi vì nó kéo tất cả các bình luận cùng một lúc, nhưng nó vẫn không phải là một sự tham gia (đó là những gì tất cả các tài liệu dường như nói). Cách duy nhất tôi có thể tham gia là sử dụng :joins
thay vì :include
:
Post.all(:joins => :comments)
Và nhật ký hiển thị:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Tui bỏ lỡ điều gì vậy? Tôi có một ứng dụng với nửa tá hiệp hội và trên một màn hình tôi hiển thị dữ liệu từ tất cả chúng. Có vẻ như sẽ tốt hơn nếu có một truy vấn tham gia thay vì 6 cá nhân. Tôi biết rằng thông minh về hiệu suất không phải lúc nào cũng tốt hơn khi tham gia thay vì truy vấn riêng lẻ (thực tế nếu bạn dành thời gian, có vẻ như hai truy vấn riêng lẻ ở trên nhanh hơn tham gia), nhưng sau tất cả các tài liệu Tôi đã đọc tôi ngạc nhiên khi thấy :include
không hoạt động như quảng cáo.
Có lẽ Rails là người nhận thức được vấn đề về hiệu suất và không tham gia trừ một số trường hợp nhất định?
includes
(đối với bất kỳ ai đọc cái này)