Mysql 在Rails中加入关联记录的同时急切地加载该记录

Mysql 在Rails中加入关联记录的同时急切地加载该记录,mysql,ruby-on-rails,Mysql,Ruby On Rails,假设我有书,每本都属于一位作者。我想打印一份图书清单以及一些相关的作者信息。作为初始通行证,我只需使用 @books = Book.all 在我的控制器和 book.author.name 在我看来,这导致了@books.count单独的查询(“n+1”问题)。建议的解决方案是 @books = Books.includes(:author) 这将它减少到一个固定数量的查询 现在,如果我需要根据一些与作者有关的标准来过滤图书列表,我会在控制器中这样做 @books = Books.join

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

@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%";


但是除了编写一个SQL查询字符串,Railsish还有什么方法可以实现这一点呢

这应该可以完成这项工作:

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

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

这应该可以完成以下任务:

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

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

Milan的示例有效;我认为您只需要为名称指定表格,以避免歧义;我认为您只需要为name指定表,以避免歧义。