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
Для получения версий коллекций кеша общих данных вызовите:
CommonDataCaching.versions
При необходимости, чтобы не обновлять кеш при создании или редактировании определенной записи, передайте skip_common_data_caching: true
в качестве аргумента:
User.create(email: "[email protected]", skip_common_data_caching: true)
User.find(1).update(name: "User", skip_common_data_caching: true)
Сортировка
Для применения сортировки, передайте опцию 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'