Индекс на commenter_id
помогает, когда вы хотите найти комментарии для данного commenter_id
(«найди мне все комментарии, сделанные Джо»).
Но когда вы делаете c.commenter
you 'ищет пользователей, предположительно того, чей id
равен комментарию commenter_id
.Уже должен быть индекс для столбца id
.Безошибочный способ состоит в том, чтобы взять фактические сгенерированные SQL-операторы (в разработке они находятся в development.log) и использовать для них объяснение, например
explain select * from comments where id = 12345
Учитывая, что очень маловероятно, что вам удалось создатьтаблица без индекса в столбце id
, наиболее вероятная причина - стремительная загрузка - если в сообщении содержится 500 комментариев, то приведенный выше код извлекает связанных пользователей по одному, и эти 500 циклических переходов в базу данных складывают
c.includes(:commenter).collect {...}
или
c.eager_load(:commenter).collect {...}
исправят это (в приведенных выше фрагментах предполагается, что вы используете рельсы 3).