Мне нужна помощь с оптимизацией Ruby в отношении загрузки ассоциаций по запросу.
Это упрощенный пример. У меня 3 модели: Post
, Comment
, User
. Ссылки: Post
содержит много комментариев, а Comment
ссылается на User
(:author). Теперь, когда я перехожу на страницу сообщения, я ожидаю увидеть тело сообщения + все комментарии (и имена их соответствующих авторов). Для этого требуются следующие 2 запроса:
select * from Post -- to get post data (1 row)
select * from Comment inner join User -- to get comment + usernames (N rows)
В коде у меня есть:
Post.find(params[:id], :include => { :comments => [:author] }
Но это не работает так, как ожидалось: как я вижу в бэкенде, по-прежнему есть N+1 совпадений (хотя некоторые из них кэшируются). Как я могу это оптимизировать?
UPD. После некоторого расследования оказалось, что код был правильным, но он не работает должным образом, если я указал в модели Comment имя contains_to. Как только я сменил :author на :user, все заработало, как и ожидалось.