Ruby on rails 包括Rails中的关联优化

Ruby on rails 包括Rails中的关联优化,ruby-on-rails,optimization,activerecord,associations,Ruby On Rails,Optimization,Activerecord,Associations,我正在寻找Ruby优化方面关于按需加载关联的帮助 这是一个简化的例子。我有三种型号:Post,Comment,User。参考文献包括:Post有许多评论,Comment参考了User(:author)。现在,当我转到帖子页面时,我希望看到帖子正文+所有评论(以及它们各自的作者姓名)。这需要以下两个查询: select * from Post -- to get post data (1 row) select * from Comment inner join User -- to get co

我正在寻找Ruby优化方面关于按需加载关联的帮助

这是一个简化的例子。我有三种型号:
Post
Comment
User
。参考文献包括:
Post
有许多评论,
Comment
参考了
User
(:author)。现在,当我转到帖子页面时,我希望看到帖子正文+所有评论(以及它们各自的作者姓名)。这需要以下两个查询:

select * from Post -- to get post data (1 row)
select * from Comment inner join User -- to get comment + usernames (N rows)
在代码中,我有:

Post.find(params[:id], :include => { :comments => [:author] }
但它并没有像预期的那样工作:正如我在后端看到的,仍然有N+1个命中(尽管其中一些是缓存的)。我如何优化它

UPD
经过一些调查,看起来代码是正确的,但在我在注释模型中命名为“所属对象”的情况下,它并没有像预期的那样工作。一旦我从:author改为:user,它就按预期工作。

如果您对2/3的查询感到满意,您可以尝试:

@post = Post.find params[:id]
@comments = Comments.find_by_post_id(params[:id], :include => [:author])

编辑:您是否尝试过:


Post.find(params[:id],:include=>{:comments=>:author}

在我的项目中,我与您的
Post
Comment
User
模型有类似的关系。我只看到三个实际的sql查询

Post.find(1, :include => { :comments => [:author] })
从调试日志中可以看到这三个查询

SELECT * FROM `posts` WHERE (`posts`.`id` = 1)
SELECT `comments`.* FROM `comments` WHERE (`comments`.`post_id` = 1)
SELECT * FROM `authors` WHERE (`authors`.`id` IN (4,8,15,16,23,42)) 

我对上一个变体做得很好,但仍然看到它分别加载作者(通过注释多次访问数据库)哦,看起来你可以筑巢了includes@Corey-是的,正如您在我的问题中所看到的,我一直在关注这篇文章,但这并没有像您预期的那样起作用。@vlad-您是否调查过如何通过创建日期描述来排序评论?@post.comments(:include=>[:author],:order=>'created_at desc')我更新了,它改变了吸引用户(作者)的方式取决于我所属的内容。你调查过如何通过创建日期描述来排序注释吗?你的意思是这样的吗?:Post.find(1,:include=>{:comments=>:author},:order=>'comments.created_at desc')不完全正确:它将此查询转换为内部联接,而不是附加查询,并且不包含作者到注释。
SELECT * FROM `posts` WHERE (`posts`.`id` = 1)
SELECT `comments`.* FROM `comments` WHERE (`comments`.`post_id` = 1)
SELECT * FROM `authors` WHERE (`authors`.`id` IN (4,8,15,16,23,42))