Вы можете сохранить эту информацию в базе данных вместо ее пересчета, используя:
- Кэширование счетчика
- Пользовательские обратные вызовы
Кэширование счетчика
Например, если вы измеряете количество значков, вы можете создать поле базы данных в 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, и вам придется делать это самостоятельно, если вы используете пользовательские обратные вызовы или у вас необычная ситуация.