grape-listing 1.3.3 → 1.3.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 753ca42cbbc590322ae50cc4deb2319abbf1ed42971f3465d47fd437ae59426b
4
- data.tar.gz: 8340c60d43bfaf42cd28507f78797802a2a02d59c5520ff538b20f5f2573a8d7
3
+ metadata.gz: ce3fabc3535ed2bcff72cf023731eb2735b5125172952eaed585e76b51d1829d
4
+ data.tar.gz: edf8e6afdcaf150eb451852184063eeeaceab550690cd5e96602fdd345ed8c57
5
5
  SHA512:
6
- metadata.gz: 61b65a31634ecd111fa68f0769c80fc2668e9d80b8f61e262fc4f989e499232af1bdeacfe1c6abc711b81bf92f43c9c2630242b8c3229395c68c7a8b40e3c7f1
7
- data.tar.gz: e102f06d75c44ddc18b657cefe265f0d9fc6c9cff86640352be57079c1af8032a14bed7c3481e3418fe1e439af48b0ee549bd57bfa4ab43e2dee2bea67532e3f
6
+ metadata.gz: cc56a44b5ff3259e37519142891cb9a332e3833c0c88bf9a37b3aec5ea31d7c6077cb6c7dd664d8407a288d77d7dc992898b58f3117536eabe5159638204c592
7
+ data.tar.gz: 73b3df84fbcc94f86bbc41c5323aa1bf8ce5ddbb00890199d560bf3d00fd1fda704a57d9dce71fcebaf84b07b094a6495b6fe5090899009bfeaf30f3151c8733
data/README.md CHANGED
@@ -33,17 +33,19 @@ end
33
33
 
34
34
  Опции (с примерами):
35
35
 
36
- `model: User` - модель, записи которой нужно обработать.
36
+ `model: User` - модель, записи которой нужно обработать
37
37
 
38
- `entity: UserEntity` - класс Grape Entity, который обработает каждую запись (передается вместо `fields`).
38
+ `preload: [:posts]` - связи, которые нужно подгрузить для eager load
39
+
40
+ `entity: UserEntity` - класс Grape Entity, который обработает каждую запись (передается вместо `fields`)
39
41
 
40
42
  `scopes: proc {...}` - блок кода для применения
41
43
 
42
- `fields: %i[...]` - список полей, которые должны присутствовать в списке записей (передается вместо `entity`).
44
+ `fields: %i[...]` - список полей, которые должны присутствовать в списке записей (передается вместо `entity`)
43
45
 
44
- `search: %w[...]` - список полей, по которым должна осуществляться фильтрация (поиск).
46
+ `search: %w[...]` - список полей, по которым должна осуществляться фильтрация (поиск)
45
47
 
46
- `sortable: %w[...]` - список полей, по которым может осуществляться сортировка.
48
+ `sortable: %w[...]` - список полей, по которым может осуществляться сортировка
47
49
 
48
50
  `paginate: false` - отдавать результат без пагинации, сразу всей коллекцией (по умолчанию - с пагинацией)
49
51
 
data/lib/grape/dsl.rb CHANGED
@@ -4,13 +4,13 @@ module Grape
4
4
  module DSL
5
5
  module InsideRoute
6
6
 
7
- def listing(model:, entity:, scopes: nil, search: nil, sortable: nil, paginate: true, caching: false)
7
+ def listing(model:, entity:, scopes: nil, search: nil, sortable: nil, paginate: true, caching: false, preload: nil)
8
8
  # параметры запроса API
9
9
  request_method = request.env['REQUEST_METHOD']
10
10
  request_uri = request.env['REQUEST_URI']
11
11
 
12
12
  # опции для сервиса
13
- opts = listing_opts(model, entity, scopes, search, sortable, caching, request_method, request_uri)
13
+ opts = listing_opts(model, entity, scopes, search, sortable, caching, request_method, request_uri, preload)
14
14
 
15
15
  if params[:spreadsheet]
16
16
  listing_spreadsheet(**opts)
@@ -23,10 +23,11 @@ module Grape
23
23
 
24
24
  private
25
25
 
26
- def listing_opts(model, entity, scopes, search, sortable, caching, request_method, request_uri)
26
+ def listing_opts(model, entity, scopes, search, sortable, caching, request_method, request_uri, preload)
27
27
  # стандартные опции
28
28
  opts = {
29
29
  model:,
30
+ preload:,
30
31
  entity:,
31
32
  scopes:,
32
33
  search:,
@@ -7,6 +7,9 @@ module GrapeListing
7
7
  # обрабатываемая модель
8
8
  @model = args[:model]
9
9
 
10
+ # список связей, необходимых для подгрузки eager load
11
+ @preload = args[:preload] || []
12
+
10
13
  # параметры адреса запроса API
11
14
  @request_method = args[:request_method]
12
15
  @request_uri = args[:request_uri]
@@ -17,7 +17,7 @@ module GrapeListing
17
17
 
18
18
  def list
19
19
  # коллекция записей ActiveRecord для применения аггрегирования
20
- list = @objects || @model.merge(@scopes)
20
+ list = @objects || @model.preload(@preload).merge(@scopes)
21
21
 
22
22
  # применение сортировки к коллекции записей
23
23
  @objects = list.merge(sort_proc)
@@ -17,7 +17,7 @@ module GrapeListing
17
17
 
18
18
  def paginate
19
19
  # коллекция записей ActiveRecord для применения аггрегирования
20
- list = @objects || @model.merge(@scopes)
20
+ list = @objects || @model.preload(@preload).merge(@scopes)
21
21
 
22
22
  # применение сортировки и пагинации к коллекции записей
23
23
  @objects = list.offset(@offset).merge(sort_proc).limit(@limit)
@@ -6,7 +6,7 @@ module GrapeListing
6
6
  def search
7
7
  @search_fields&.each do |field|
8
8
  # коллекция записей для дальнейшей фильтрации
9
- list = @objects || @model.merge(@scopes)
9
+ list = @objects || @model.preload(@preload).merge(@scopes)
10
10
 
11
11
  # оператор и значение для поиска
12
12
  operator, value = search_operands(field)
@@ -5,7 +5,7 @@ module GrapeListing
5
5
 
6
6
  def sort_proc
7
7
  # проверка необходимости нестандартной сортировки
8
- unless custom_sorting_field
8
+ if !@sortable.is_a?(Array) || @sortable.empty? || custom_sorting_field.blank?
9
9
  return proc { order('id DESC NULLS LAST') }
10
10
  end
11
11
 
@@ -22,7 +22,7 @@ module GrapeListing
22
22
 
23
23
  # поиск поля для индивидуальной сортировки среди допустимых
24
24
  def custom_sorting_field
25
- @custom_sorting_field ||= @sortable&.select { |i| i.split('|')[0] == @params['sort_by'] }&.first
25
+ @custom_sorting_field ||= @sortable.select { |i| i.split('|')[0] == @params['sort_by'] }.first
26
26
  end
27
27
 
28
28
  end
@@ -15,7 +15,7 @@ module GrapeListing
15
15
  search
16
16
 
17
17
  # коллекция записей ActiveRecord для формирования эл. таблицы
18
- records = @objects || @model.merge(@scopes)
18
+ records = @objects || @model.preload(@preload).merge(@scopes)
19
19
 
20
20
  # ограничение записей
21
21
  records = records.order(:id).offset(@offset).limit(@limit)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-listing
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
4
+ version: 1.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Павел Бабин
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-25 00:00:00.000000000 Z
11
+ date: 2024-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack