ActiveRecord Rails 4.2 - 过滤包括查询

时间:2017-04-28 14:46:44

标签: ruby-on-rails rails-activerecord

我试图在我的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:请原谅书面代码中的任何拼写错误。

0 个答案:

没有答案