Common Data Caching

Gem Version

Гем для кеширования общих данных 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'