Как я могу включить association.count в запрос ActiveRecord, чтобы он не выполнял второй запрос? - PullRequest
1 голос
/ 03 сентября 2011

В моих моделях часто встречаются ассоциации has_many. Мне также часто нужно отображать, сколько их (то есть assoc.count). Это заставляет выполнить другой запрос, как показано ниже:

ruby-1.8.7-p334 :020 > Instructor.first.instructors_lessons.count
  Instructor Load (0.5ms)  SELECT `users`.* FROM `users` INNER JOIN `instructor_profiles` ON `instructor_profiles`.`instructor_id` = `users`.`id` LIMIT 1
  SQL (1.2ms)  SELECT COUNT(*) FROM `instructors_lessons` WHERE (`instructors_lessons`.instructor_id = 2817)

Это хорошо, когда есть один или два, но когда есть 100+, этот процесс становится заметно медленным. Пожалуйста, посмотрите на этот чрезвычайно медленный процесс (http://pastebin.com/p4Sj7q7s). Я работал над одной очень медленной страницей с кэшированием.

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

 select("instructors.*, count('instructors_lessons.instructor_id') as num_lessons").

Но тогда я не могу просто сказать instructor.lessons.count ...

Есть ли способ использовать joins () или include (), чтобы этот дополнительный запрос COUNT () не требовался?

1 Ответ

7 голосов
/ 03 сентября 2011

Звучит так, будто вы ищете кеш счетчика .

Вы просто создаете столбец с _count и затем указывает counter_cache в вашей принадлежности к ассоциации.

В вашем случае вы бы добавили поле с названием "examples_count" в колонку вашего инструктора. Затем сделайте следующее:

belongs_to :instructor, :counter_cache => true

Это значение будет автоматически обновлять итоговое значение при изменении общего количества связанных записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...