渴望加载相关记录,同时也加入Rails

时间:2010-12-22 08:39:33

标签: mysql ruby-on-rails

假设我有书,每个都属于作者。我想打印一份书籍清单以及一些相关的作者信息。我想,作为初始通行证,只需使用

@books = Book.all

在我的控制器和

book.author.name

在我看来,导致@books.count个单独的查询(“n + 1”问题)。推荐的解决方案是

@books = Books.includes(:author)

将其减少为恒定数量的查询。

现在,如果我需要根据与作者有关​​的一些标准来过滤图书清单,我会在控制器中进行

@books = Books.joins(:author).where('name like "%Richler%"')

但这会重新引入“n + 1”问题。如果我尝试在查询中放入.includes(:author),它会尝试将其拉两次,name变得模棱两可。在常规MySQL中,我只会使用类似的东西:

SELECT * FROM books LEFT OUTER JOIN authors ON books.author_id = authors.id
  WHERE authors.name LIKE "%Richler%";

SELECT * FROM books, authors WHERE
  authors.name LIKE "%Richler%" AND books.author_id = authors.id;

但是只写一个SQL查询字符串,Railsish的方法是什么?

1 个答案:

答案 0 :(得分:4)

这应该做的工作:

Book.joins(:author).where('authors.name like "%Richler%"').includes(:author)

这应该只触发两个SQL查询。