使用STI查询数据库的效率

时间:2013-04-12 22:58:14

标签: ruby-on-rails database ruby-on-rails-3 indexing single-table-inheritance

我很好奇rails如何查询使用STI的表。例如,如果我的父类是Book,并且我有两个子类ComicBookNovel,如果我执行类似

的操作
Novel.all.each

因为只有一张桌子,服务器是否也会翻阅所有漫画书?是否自动添加了适当的索引来防止这种情况?感谢

1 个答案:

答案 0 :(得分:2)

嗯,你不能做Novel.eacheach没有在模型类上定义。但是,您可以Novel.all.each ...执行...某些阻止。

至于查询的工作方式,只需在任何ARel表达式上调用to_sql即可。 Novel.all将返回模型集合本身,因此您需要更进一步以确保通过调用scoped返回有效的ARel表达式。

[1] pry(main)> Novel.scoped.to_sql
=> "SELECT \"books\".* FROM \"books\" WHERE \"books\".\"type\" IN ('Novel')"

经常查询的大多数列的索引是一件好事需要考虑。是的,如果没有索引,您的rdbms必须查看表中的所有记录,作为上述条件检查的一部分。