我很好奇 Rails 如何查询使用 STI 的表。例如,如果我的父类是 Book
并且我有两个子类 ComicBook
和 Novel
如果我做类似的事情
Novel.all.each
因为只有一张 table ,服务器是否也轮流浏览所有漫画书?是否自动添加了适当的索引以防止这种情况发生?谢谢
最佳答案
嗯,你不能做 Novel.each
,each
没有在模型类上定义。但是,您可以执行 Novel.all.each ...
,其中 ...
是一些 block 。
至于查询是如何工作的,只需在任何 ARel 表达式上调用 to_sql
。 Novel.all
将返回模型集合本身,因此您需要更进一步确保通过调用 scoped
返回有效的 ARel 表达式。
[1] pry(main)> Novel.scoped.to_sql
=> "SELECT \"books\".* FROM \"books\" WHERE \"books\".\"type\" IN ('Novel')"
按经常查询的大多数列建立索引是一件值得考虑的好事。是的,如果没有索引,作为上述条件检查的一部分,您的 rdbms 将不得不查看表中的所有记录。
关于ruby-on-rails - 使用 STI 查询数据库的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15982158/