我正在寻求有关按需加载关联的Ruby优化的帮助。
这是简化的例子。我有3个模型:Post
,Comment
,User
。引用是: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,它就按预期工作了。
答案 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)
在我的项目中,我与您的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))