在Rails中包含关联优化

时间:2010-04-14 18:43:08

标签: ruby-on-rails optimization activerecord associations

我正在寻求有关按需加载关联的Ruby优化的帮助。

这是简化的例子。我有3个模型:PostCommentUser。引用是:Post有很多评论,Comment引用User(:作者)。现在,当我进入帖子页面时,我希望看到帖子正文+所有评论(以及他们各自的作者姓名)。这需要遵循2个查询:

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 经过一些调查后,看起来代码是正确的,但如果我在Comment模型中命名了belongs_to,它就无法正常工作。一旦我从:author改为:user,它就按预期工作了。

2 个答案:

答案 0 :(得分:1)

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

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

@comments = @post.comments(:include => [:author])

编辑:您是否尝试过:

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

答案 1 :(得分:1)

在我的项目中,我与您的PostCommentUser模型有类似的关系。我只看到三个实际的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))