假设我有书,每个都属于作者。我想打印一份书籍清单以及一些相关的作者信息。我想,作为初始通行证,只需使用
@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的方法是什么?
答案 0 :(得分:4)
这应该做的工作:
Book.joins(:author).where('authors.name like "%Richler%"').includes(:author)
这应该只触发两个SQL查询。