我很好奇rails如何查询使用STI的表。例如,如果我的父类是Book
,并且我有两个子类ComicBook
和Novel
,如果我执行类似
Novel.all.each
因为只有一张桌子,服务器是否也会翻阅所有漫画书?是否自动添加了适当的索引来防止这种情况?感谢
答案 0 :(得分:2)
嗯,你不能做Novel.each
,each
没有在模型类上定义。但是,您可以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必须查看表中的所有记录,作为上述条件检查的一部分。