比方說,我有一個簡單的模型關聯,其中博客Post
上有很多Comments
。ActiveRecord Eager在初始查詢後加載
class Post < ActiveRecord::Base
has_may :comments
end
如果我想避免「N + 1」的查詢和貪婪加載所有關聯事前,我可以做 -
Post.includes(:comments).where(title: "foo")
,哪個跑得兩個查詢。第一個使用where
條件查找Post
,第二個查找所有關聯的comments
。
但是如果我已經有一個Post
對象呢?我可以在初始結果集之後「添加」includes
以運行查找所有關聯的第二個批量查詢嗎?
做一個延遲的渴望加載看起來並不直觀,但我認爲一次查找所有關聯仍然可以避免我在循環查看時單獨查找它們。
例如
p = Post.where(title: "foo")
# Will the below work?
p.includes(:comments)
p.comments.each do |comment|
puts comment.text
end
Post.includes(:comments).where(title:「foo」)這將實際上只運行查詢。 它應該是類似於 select * from文章p內部連接評論c on c.post_id = p.id其中p.title ='foo' – Typpex