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.

Коллекции

Для кеширования разных коллекций в рамках одной модели воспользуйтесь опцией collections, передав в нее массив объектов, содержимое каждого их которых соответствует стандартным опциям; значение ключа кеша укажите в key:

class User < ActiveRecord::Base
  common_cache collections: [
    {
      key: 'admin_users',
      attrs: %i[email name],
      scope: proc { where(role: 'admin') }
    },
    {
      key: 'manager_users',
      attrs: [:name],
      scope: proc { where(role: 'manager') }
    }
  ]

Массовое обновление коллекций

Для массового обновления всех коллекций воспользутесь Rake таском:

rake common_data_caching:update_cache

Capistrano

Для обновления кеша общих данных при каждом деплое с помощью Capistrano добавьте в Capfile:

require 'common_data_caching/capistrano'