我有一个线程模型有很多Posts
,每个帖子都有一个作者(用户)
class Thread < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :thread
belongs_to :user
end
在我的线程控制器show
动作+视图中,我希望遍历该特定线程的所有帖子并访问有关该用户的信息。
controller:
@thread = Thread.find(params[:id])
view
thread.posts.each do |p|
if p.user.first_name = '....'
end
end
目前正在进行的是查找正确Thread
的查询,查找所有Posts
的查询,然后每个帖子都是这样做的:
SELECT "users".* FROM "users" WHERE "users"."id" = x
即使同一个用户发了10个帖子,对于特定用户,它仍然会被调用10次。
是否有某种方法可以使用includes
或eager_load
来避免重复此查询?
答案 0 :(得分:2)
您面临的是N + 1 queries problem
。解决方案是在第一个查询本身中包含您将需要的所有元素。您可以通过以下方式包含嵌套关联:
@thread = Thread.includes(posts: [:users]).find(params[:id])
与你的关系一样。有关详细信息,请查看documentation。
答案 1 :(得分:1)
你可以在控制器
中做这样的事情@thread = Thread.find(params[:id])
@posts = @thread.posts.includes(:user)
在视图中迭代@posts
答案 2 :(得分:1)
你可以做到
@thread = Thread.includes(:posts => :user).find(params[:id])