Поиск вопроса о загрузке Rails (: all,: include => [: model]) - PullRequest
2 голосов
/ 29 января 2010

У меня есть тема и модель проекта. У меня между ними задница «многие ко многим» (одна из HABTM).

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

@topics = Topic.all(:include => [:projects])

У меня в контроллере и пока все хорошо. Проблема в том, что модель проекта настолько велика, что запрос все еще очень медленный

Topic Load (1.5ms)   SELECT * FROM "topics" 

Project Load (109.2ms)   SELECT "projects".*, t0.topic_id as the_parent_record_id FROM "projects" INNER JOIN "projects_topics" t0 ON "projects".id = t0.project_id WHERE (t0.topic_id IN (1,2,3,4,5,6,7,8,9,10,11)) 

Есть ли способ сделать второй запрос не для выбора *, а только для имени или идентификатора? Поскольку counter_cache не поддерживается HABTM Ass, и я действительно не хочу реализовывать его самостоятельно ... так есть ли способ сделать этот второй запрос быстрее?

Мне просто нужно потянуть счет без загрузки всего объекта проекта ...

Заранее спасибо,

Николас Хок Исаза

Ответы [ 2 ]

4 голосов
/ 29 января 2010
  1. counter_cache очень легко реализовать
  2. вы можете преобразовать habtm в удвоенное значение has_many, то есть has_many: projects_topics как в модели проекта, так и в модели темы (и метод__приложения в проектах_топах), а затем использовать counter_cache или выполнять загрузку только в projects_topics
  3. Вы можете сделать: select => "count (projects_topics.id)",: group => "themes.id", но это не будет хорошо работать с postgresql, если вы заботитесь об этом ...

Второй вариант - лучший IMO, я обычно вообще не использую habtm, только двойной has_many:)

0 голосов
/ 30 января 2010

Для расширения ответа Девенва счетчик кэша - это то, что вы обычно используете для такого сценария.

Из API документов:

Кэширует количество принадлежащих объектов на ассоциированном классе через использование increment_counter и decrement_counter. Кеш счетчика увеличивается, когда объект этого класс создается и уменьшается, когда это разрушено. Это требует, чтобы столбец с именем # {table_name} _count (такой как comments_count для принадлежности Класс комментария) используется на ассоциированный класс (такой как сообщение учебный класс). Вы также можете указать пользовательский столбец кэша счетчика, предоставляя имя столбца вместо true / false значение этой опции (например, : counter_cache =>: my_custom_counter.) Примечание: указание счетчика кэша добавить его в список этой модели атрибуты только для чтения с использованием attr_readonly.

Здесь - скриншот от railscasts Райана Бейтса * counter4cache.

Здесь - это ответ на вопрос, который я задал полгода назад, когда решением было легко внедрить кеш счетчика самогона.

...