Rails有活跃记录一次性获取所有需要的关联吗?

我有一个模型评论,其中有一个用户。

在我的显示页面中,我正在做一个Comment.all ,然后显示每个评论。

在视图中,我不仅需要显示注释,还需要显示关联用户(即作者)的信息。

    ...etc...  

这很好,所有,但activerecord将其转换为一个SELECT * FROM users WHERE USER.id = commentId查询每个EACH评论我有。

这有点荒谬,特别是在有数百条评论的页面上。 (那是数百个单独的DB命中!)

当我在做Comment.all时,有没有告诉rails不仅要抓取评论,还要抓住相关用户,然后当我稍后调用comment.user.blah时,为了不再从db中获取它? (这样它就可以在一个db语句中完成所有操作)。

你应该使用.includes

从文档 :

解决N + 1查询问题

Active Record允许您事先指定要加载的所有关联。 这可以通过指定Model.find调用的includes方法来实现。 使用includes,Active Record可确保使用尽可能少的查询加载所有指定的关联。

重新审视上述情况,我们可以重写Client.all以使用预先加载的地址:

 clients = Client.includes(:address).limit(10) clients.each do |client| puts client.address.postcode end 

或者,在你的情况下,它会

 Comment.includes(:user) 

您可以使用ActiveRecord轻松完成此操作,只需使用其中的预先加载function即可。 因此, Comment.all(:include => :user)将运行一个大型查询而不是每个记录一个查询。

结帐http://stackoverflow.com/questions/29908230/rails-have-activerecord-grab-more-than-one-association-in-one-go/29908317#29908317如果您想与多个协会关联includes声明。

要点是使用Comment.includes(:user, :dates, :whatevertableetc)