1

Мне было любопытно, как рельсы запрашивают таблицу, в которой используется STI. Например, если мой родительский класс Book и у меня есть два подкласса ComicBook и Novel, если я что-то вродеЭффективность запросов к базе данных с STI

Novel.all.each 

, так как есть только одна таблица, делает сдвиг сервера через все книги комиксов, а? Соответствующая индексация автоматически добавляется, чтобы предотвратить это? Спасибо

ответ

2

Ну, вы не можете сделать Novel.each, each не определен в классах моделей. Однако вы можете сделать Novel.all.each ..., где ... - это какой-то блок.

Как работает запрос, просто вызовите to_sql на любое выражение ARel. Novel.all вернет коллекцию моделей, поэтому вам нужно сделать еще один шаг, чтобы убедиться, что действительное выражение ARel возвращается, вызывая scoped.

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

Индексирование большинством столбцов, о которых часто спрашивают, является хорошей вещью для рассмотрения. Да, без индекса ваши rdbms должны будут просмотреть все записи в таблице как часть вышеуказанной проверки состояния.

+0

Изменена моя ошибка, спасибо за ответ. – Steve

Смежные вопросы