common-data-caching 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +88 -0
- data/lib/common-data-caching.rb +1 -0
- data/lib/common_data_caching/callbacks.rb +27 -0
- data/lib/common_data_caching/capistrano/tasks/common_data_caching.rake +12 -0
- data/lib/common_data_caching/capistrano.rb +1 -0
- data/lib/common_data_caching/class_methods.rb +46 -0
- data/lib/common_data_caching/rake_tasks.rb +24 -0
- data/lib/common_data_caching.rb +33 -0
- metadata +65 -0
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
|
+
[](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: []
|