我试图在我的Rails 4.2项目中改进一些查询。特别是一个查询是在API控制器中完成的。查询如下(仅作为示例):
@books = Book.includes(:pages).where( category_id: 1 )
这产生了以下SQL:
SELECT "books".* FROM "books" WHERE "books".category_id = 1
SELECT "pages".* FROM "pages" WHERE "pages"."book_id" IN (1, 2, 3)
这很好,它在数据库方面表现良好。
然后让我们假设我需要根据页面属性过滤书籍。查询将是这样的:
@books = Book.includes(:pages).where( category_id: 1, pages: { attr1: 'bar' } )
这产生了以下SQL:
SELECT "books".attr1, "books".attr2, "pages".attr1, "pages".attr2
FROM "books"
LEFT OUTER JOIN "pages" ON "books".id = "pages".book_id
WHERE "books".category_id = 1 AND "pages".attr1 = 'bar';
这不一定是坏事。但是,我想改为使用以下SQL:
SELECT "books".* FROM "books" WHERE "books".category_id = 1
SELECT "pages".* FROM "pages" WHERE "pages"."book_id" IN (1, 2, 3) AND "pages".attr1 = 'bar'
您会发现,为数据库中的每个单独查询创建索引更容易。
有没有办法可以实现我的目标?
感谢。
PS:请原谅书面代码中的任何拼写错误。