Как избежать постоянного пересчета сводных данных с помощью Rails? - PullRequest
1 голос
/ 11 сентября 2011

У меня есть страница профиля пользователя, которая имеет боковую панель со статистикой пользователя, похожей на страницу профиля переполнения стека (например, общее количество посещений, количество значков).

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

Сохранение агрегированных сводных данных в базе данных может привести к проблемам (т. Е. К несогласованности).

Ответы [ 2 ]

6 голосов
/ 11 сентября 2011

Вы можете сохранить эту информацию в базе данных вместо ее пересчета, используя:

  1. Кэширование счетчика
  2. Пользовательские обратные вызовы

Кэширование счетчика

Например, если вы измеряете количество значков, вы можете создать поле базы данных в User с именем badges_count, тогда в модели Badge будет иметь значение belongs_to :user, :counter_cache => true.Теперь, когда количество значков изменяется, вы можете получить доступ к счету без каких-либо новых вычислений в @user.badges_count.

Базовая реализация: http://asciicasts.com/episodes/23-counter-cache-column

Настраиваемые обратные вызовы

Допустим, у вас есть поле, которое измеряет поведение, которое является более сложным, чем простой подсчет.В этом случае просто реализуйте обратные вызовы, которые обновляют поле всякий раз, когда происходит определенное действие, используя before_save, after_save, before_create и т. Д.

О несоответствии

Хранение данных вВаша база данных будет противоречивой, только если вы делаете это неправильно.Существует конечное число путей, по которым может обновляться любая статистика, и вы должны убедиться, что все пути включены в обновление независимо от того, какое поле вы используете.Rails делает это для вас с counter_caching, и вам придется делать это самостоятельно, если вы используете пользовательские обратные вызовы или у вас необычная ситуация.

0 голосов
/ 11 сентября 2011

Вы можете использовать скрытый div, как в этом вопросе ( Кэширование данных с использованием скрытых div ). В зависимости от того, сколько данных вы хотите кэшировать, это может быть хорошим решением.

...