common-data-caching 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 3807a5c6b09ddd98dfcb3b476defd965be5b6c158577c212284eb2f1521197e3
4
+ data.tar.gz: 6a715c0d8a1f00ed3efab75ad5b4f5fba86d346804e0dc8aab776df35363f002
5
+ SHA512:
6
+ metadata.gz: d5a7cedbb2265e339fb3b022fdd54b37b878a0c3bb16d873a3b84bdc5394f993e07a42ed13055c5d2fb9e3e07f13f4ba2ff24931871dffdc75b9b80b31550d90
7
+ data.tar.gz: e9d850897b225c517d8edea7f939d3359f7cb0297ee26e42efc205ab58f81e1c58966df858a8714922f67fd929d23cc096ccf9727c0b6e2ae3dd86e80f5609d5
data/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # Common Data Caching
2
+ [![Gem Version](https://badge.fury.io/rb/common-data-caching.svg)](https://badge.fury.io/rb/common-data-caching)
3
+
4
+ Гем для кеширования общих данных Rails.
5
+
6
+ Часто в проектах Rails приходится формировать списки объектов для их дальнейшей обработки фронтендом (например отображение опций в селектах).
7
+
8
+ Подобные коллекции могут вызываться очень часто. И, чтобы не нагружать БД, лучше их кешировать.
9
+
10
+ Этот гем предназначен для простого кеширования необходимых данных и получения готовых кешированных коллекций.
11
+
12
+ ## Установка
13
+
14
+ Добавить в Gemfile
15
+
16
+ ```ruby
17
+ gem 'common-data-caching'
18
+ ```
19
+
20
+ И выполнить:
21
+
22
+ ```bash
23
+ bundle
24
+ ```
25
+
26
+ ## Использование
27
+
28
+ Добавьте вызов `common_cache` на моделях, передав обязательную опцию `attrs` со списком атрибутов, которые должны быть в закешированной коллекции (`id` будет добавлен по умолчанию, добавлять его не обязательно):
29
+
30
+ ```ruby
31
+ class User < ActiveRecord::Base
32
+ common_cache attrs: %i[email name]
33
+ end
34
+ ```
35
+
36
+ Коллекция кеша будет обновляться после каждого изменения записи модели - создании, обновлении, удалении.
37
+
38
+ Для получения коллекции кеша общих данных вызовите метод `common_data_cache_collection`:
39
+
40
+ ```ruby
41
+ User.common_data_cache_collection
42
+ ```
43
+
44
+ ### Сортировка
45
+
46
+ Для применения сортировки, передайте опцию `order`:
47
+
48
+ ```ruby
49
+ class User < ActiveRecord::Base
50
+ common_cache attrs: %i[email name],
51
+ order: 'name desc'
52
+ end
53
+ ```
54
+
55
+ Значение опции `order` должно соответствовать тем же значениям, которые принимает метод `.order` ActiveRecord.
56
+
57
+ По умолчанию, сортировка осуществляется по `id` в направлении `ASC`, до тех пор пока не будет передан `order`.
58
+
59
+ ### Фильтрация
60
+
61
+ Для применения фильтрации/ограничений записей, из которых будет сформирована закешированная коллекция, передайте опцию `scope`:
62
+
63
+ ```ruby
64
+ class User < ActiveRecord::Base
65
+ common_cache attrs: %i[email name],
66
+ scope: proc { where(role: 'admin') }
67
+ end
68
+ ```
69
+
70
+ Значение опции `scope` должно быть условием `where` ActiveRecord, Rails скоупом или их последовательностью, которые необходимо обернуть в `proc`.
71
+
72
+ По умолчанию, фильтрация не применяется, до тех пор пока не будет передан `scope`.
73
+
74
+ ## Массовое обновление коллекций
75
+
76
+ Для массового обновления всех коллекций воспользутесь Rake таском:
77
+
78
+ ```bash
79
+ rake common_data_caching:update
80
+ ```
81
+
82
+ ## Capistrano
83
+
84
+ Для обновления кеша общих данных при каждом деплое с помощью Capistrano добавьте в Capfile:
85
+
86
+ ```ruby
87
+ require 'common_data_caching/capistrano'
88
+ ```
@@ -0,0 +1 @@
1
+ require 'common_data_caching'
@@ -0,0 +1,27 @@
1
+ module CommonDataCaching
2
+ module Callbacks
3
+
4
+ extend ActiveSupport::Concern
5
+
6
+ def common_data_caching?
7
+ true
8
+ end
9
+
10
+ private
11
+
12
+ def update_common_data_cache
13
+ # обновить коллекцию кеша всей сущности
14
+ self.class.update_common_data_cache
15
+
16
+ # удалить отдельно кешированную запись
17
+ key = self.class.common_cache_key(id)
18
+ Rails.cache.delete(key)
19
+ end
20
+
21
+ def update_common_data_cache_versions
22
+ # обновление версии кешированной коллекции
23
+ self.class.update_common_data_cache_versions
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ namespace :common_data_caching do
2
+ desc 'Обновление кеша общих данных'
3
+ task :update do
4
+ on roles(:app) do
5
+ within release_path do
6
+ with rails_env: "#{fetch(:stage)}" do
7
+ execute :rake, 'common_data_caching:update_cache'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1 @@
1
+ load File.expand_path('../capistrano/tasks/common_data_caching.rake', __FILE__)
@@ -0,0 +1,46 @@
1
+ module CommonDataCaching
2
+ module ClassMethods
3
+
4
+ def common_data_caching?
5
+ true
6
+ end
7
+
8
+ def common_data_cache_key(id = nil)
9
+ ['common-data-caching', to_s, id].compact.join('_')
10
+ end
11
+
12
+ def common_data_cache_collection
13
+ Rails.cache.fetch(common_data_cache_key) || []
14
+ end
15
+
16
+ def update_common_data_cache
17
+ scope = cache_opts[:scope] || proc { where('1=1') }
18
+ ordering = cache_opts[:order] || :id
19
+
20
+ data = merge(scope).order(ordering).prepare_common_data_collection
21
+ Rails.cache.write(common_cache_key, data)
22
+ end
23
+
24
+ def update_common_data_cache_versions
25
+ versions = Rails.cache.read('common_cache_versions') || {}
26
+ versions[to_s] = Time.now.to_i
27
+ Rails.cache.write('common_cache_versions', versions)
28
+ end
29
+
30
+ def prepare_common_data_collection
31
+ # колонка ID по умолчанию
32
+ hash = { id: :id }
33
+
34
+ cache_opts[:attrs].flatten.map do |key|
35
+ key.is_a?(Hash) ? hash.merge!(key) : hash.merge!(key => key)
36
+ end
37
+
38
+ keys = hash.keys.unshift(:id)
39
+
40
+ all.map do |object|
41
+ keys.to_h { |title| [title, object.send(hash[title])] }
42
+ end
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,24 @@
1
+ namespace :common_data_caching do
2
+
3
+ desc 'Обновить кеш общих данных'
4
+ task update_cache: :environment do
5
+ # получение списка моделей
6
+ Rails.application.eager_load!
7
+ models = ActiveRecord::Base.descendants
8
+
9
+ # удаление старых версий кеша
10
+ Rails.cache.delete('common_cache_versions')
11
+
12
+ models.each do |model|
13
+ # проверка - в модели предусмотрено кеширование общих данных
14
+ next unless model.common_data_caching?
15
+
16
+ # обновление кеша
17
+ model.update_common_cache
18
+
19
+ # обновление версий кеша
20
+ model.update_common_cache_versions
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,33 @@
1
+ require 'rake'
2
+ require 'common_data_caching/callbacks'
3
+ require 'common_data_caching/class_methods'
4
+ require 'common_data_caching/rake_tasks'
5
+
6
+ module CommonDataCaching
7
+ end
8
+
9
+ ActiveSupport.on_load(:active_record) do
10
+ class ActiveRecord::Base
11
+ def self.common_data_caching?
12
+ false
13
+ end
14
+
15
+ def common_data_caching?
16
+ self.class.common_data_caching?
17
+ end
18
+
19
+ def self.common_cache(options= {})
20
+ # опции кешинга
21
+ class_attribute :cache_opts
22
+ self.cache_opts = options
23
+
24
+ # методы кеширования
25
+ extend CommonDataCaching::ClassMethods
26
+
27
+ # установка коллбэков
28
+ include CommonDataCaching::Callbacks
29
+ after_commit :update_common_data_cache, on: %i[create update destroy], if: :common_data_caching?
30
+ after_commit :update_common_data_cache_versions, on: %i[create update destroy], if: :common_data_caching?
31
+ end
32
+ end
33
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: common-data-caching
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Павел Бабин
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-03-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '6.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '6.0'
27
+ description: Кеширование общих данных
28
+ email: babin359@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - README.md
34
+ - lib/common-data-caching.rb
35
+ - lib/common_data_caching.rb
36
+ - lib/common_data_caching/callbacks.rb
37
+ - lib/common_data_caching/capistrano.rb
38
+ - lib/common_data_caching/capistrano/tasks/common_data_caching.rake
39
+ - lib/common_data_caching/class_methods.rb
40
+ - lib/common_data_caching/rake_tasks.rb
41
+ homepage:
42
+ licenses:
43
+ - MIT
44
+ metadata:
45
+ rubygems_mfa_required: 'true'
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 3.1.0
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubygems_version: 3.0.6
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: Кеширование общих данных
65
+ test_files: []