Common Data Caching
Гем для кеширования общих данных Rails.
Часто в проектах Rails приходится формировать списки объектов для их дальнейшей обработки фронтендом (например отображение опций в селектах).
Подобные коллекции могут вызываться очень часто. И, чтобы не нагружать БД, лучше их кешировать.
Этот гем предназначен для простого кеширования необходимых данных и получения готовых кешированных коллекций.
Установка
Добавить в Gemfile
gem 'common-data-caching'
И выполнить:
bundle
Использование
Добавьте вызов common_cache на моделях, передав обязательную опцию attrs со списком атрибутов, которые должны быть в закешированной коллекции (id будет добавлен по умолчанию, добавлять его не обязательно):
class User < ActiveRecord::Base
common_cache attrs: i[email name]
end
Коллекция кеша будет обновляться после каждого изменения записи модели - создании, обновлении, удалении.
Для получения коллекции кеша общих данных вызовите метод common_data_cache_collection:
User.common_data_cache_collection
Сортировка
Для применения сортировки, передайте опцию order:
class User < ActiveRecord::Base
common_cache attrs: i[email name],
order: 'name desc'
end
Значение опции order должно соответствовать тем же значениям, которые принимает метод .order ActiveRecord.
По умолчанию, сортировка осуществляется по id в направлении ASC, до тех пор пока не будет передан order.
Фильтрация
Для применения фильтрации/ограничений записей, из которых будет сформирована закешированная коллекция, передайте опцию scope:
class User < ActiveRecord::Base
common_cache attrs: i[email name],
scope: proc { where(role: 'admin') }
end
Значение опции scope должно быть условием where ActiveRecord, Rails скоупом или их последовательностью, которые необходимо обернуть в proc.
По умолчанию, фильтрация не применяется, до тех пор пока не будет передан scope.
Массовое обновление коллекций
Для массового обновления всех коллекций воспользутесь Rake таском:
rake common_data_caching:update_cache
Capistrano
Для обновления кеша общих данных при каждом деплое с помощью Capistrano добавьте в Capfile:
require 'common_data_caching/capistrano'