2014-09-07 2 views
0

Я пытаюсь добавить счет к каждой ссылке в навигационной панели. Каждая ссылка на навигационной панели переходит в разные модели.рельсы количество записей для нескольких таблиц на каждой странице приложения

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

Как кешировать эту информацию? counter_cache, похоже, только для ассоциаций. Это автономные модели, не требующие ассоциаций.

+0

что мы точно подсчитываем, количество записей внутри каждой таблицы? –

+0

да, это правильно. – ahnbizcad

+1

хорошо, есть несколько вариантов, либо кеширование страницы, либо сохранение этих подсчетов в какой-либо новой таблице, либо на самом деле счет, я не думаю, что это было бы так дорого, так как первичные ключи индексируются –

ответ

1

Вы можете использовать простой Model.count, он выполняет запрос на подсчет MySQL, что не должно дорого стоить.

Тогда есть активный кэш записи, который будет кэшировать результат запроса с помощью строки запроса в качестве ключа кэша, любые последующие запросы попадут в кэш, и он даже не выполнит запрос еще раз, он будет возвращен непосредственно из кеша запросов, поэтому я не думаю, что это было бы дорого.

EDIT:

О .size, это способ для enumerable, как массивы, чтобы использовать его вам нужно получить результирующий набор, чтобы вычислить его размер, что набор результатов дополнительные данные, которые вы не нужно, вы просто заинтересованы в счет, так что вы просто должны сказать, базу данных, чтобы принести счет, отсюда Model.count, вот пример из приложения у меня уже есть:

User.count 
(0.2ms) SELECT COUNT(*) FROM `users` 

User.all.size 
User Load (71.4ms) SELECT `users`.* FROM `users` 

Обратите внимание на разницу в запросах , также разница в времени отклика, первый из них очень быстрый, потому что он уже кэширован.

Об индексе, в mysql (и я думаю, что любая уважительная база данных), любой первичный ключ должен быть уникальным и индексированным, потому что это первичный идентификатор записи, вам не нужно указывать его в миграции, создает рельсы автоматический прирост уникального первичного ключа, сам по себе, по умолчанию он даже не отображается в файлах миграции, чтобы отключить создание первичного ключа, вам нужно будет добавить дополнительную опцию id: false, которая редко необходима.

+0

Когда вы говорите, что первичные ключи индексируются, ссылаетесь ли вы на столбцы 'id' по умолчанию? Они индексируются по умолчанию Rails, правильно? Вам не нужно явно индексировать их с помощью миграции? – ahnbizcad

+0

Как насчет использования '.size'? Я читал, что это было лучше, но, похоже, это не метод класса. – ahnbizcad

+0

Я добавлю к моему ответу, потому что слишком долго –

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