Rails减少使用包含或急切加载执行的查询

时间:2014-11-12 17:32:39

标签: ruby-on-rails ruby

我有一个线程模型有很多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次。

是否有某种方法可以使用includeseager_load来避免重复此查询?

3 个答案:

答案 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])