grape-listing 1.1.8 → 1.1.10

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: b47ec8a91643cdf3b1ab90b6f2f6f3ede8ee0c0ab069b9f79b9b5c3bca7339d7
4
- data.tar.gz: 0d69408736e14c1839167cb33ec0ee8e6b335046f5989b041668c6497c0d205a
3
+ metadata.gz: 216dc8cc1fddbb989a7b093569bb9acf2c085b52a74d3a0bdfffed84ad2a48c8
4
+ data.tar.gz: 9a8a054586ff87f8c00cabfdab4002282eb1dc1b0bea57bdd876ed5e39f4abe5
5
5
  SHA512:
6
- metadata.gz: 541f2e90aa6ec5f9c6778259da1d58037ece13a5e7238765ac0641c9aac2ac7eaa8bb2c60fb9f44a4b04854220f4bdaed32ed569f8a2b5a82a6669a67df154ea
7
- data.tar.gz: 18599c3bfbedf62aa12d653b8cb052d67d5646998a1cf9a02c15bbc91b21332878a832b004809e4dc53ce2301463613792fcd17abad857cd3b60e95e71b7e90c
6
+ metadata.gz: 906c4e171bea8562f8a77e6b50eb2c742e39452ce10d81067a3cf4649e15294229eea1d4e587c724f3782c2337e3293095241d621c71a88e0d0707d1839a39bb
7
+ data.tar.gz: eace61cdf1afa188cf656c89b5fce3eeaf56d54ccd0be4ec008b43d9cf5216e2f1e26e6055ccc60767ff07551776854a5d721a954293d8fb40f3cc7bc3918381
data/README.md CHANGED
@@ -26,8 +26,7 @@ bundle
26
26
  ```ruby
27
27
  get 'users' do
28
28
  listing model: User,
29
- entity: UserEntity,
30
- search: %w[email name|ilike role|custom.for_role]
29
+ entity: UserEntity
31
30
  end
32
31
 
33
32
  ```
@@ -52,7 +51,24 @@ end
52
51
 
53
52
  ### Поиск
54
53
 
55
- Для поиска по полям необходимо передать их в запросе в виде `?field=value`. Для поиска по нескольким полям, параметры должны быть перечислены через `&`, например: `?field_1=value&field_2=value`.
54
+ Для возможности поиска необходимо передать названия полей, по которым может осуществляться поиск, в виде массива в опции `search`.
55
+
56
+ Для осуществления фильтрации необходимо передать параметры в запросе в виде `?field=value`. Для поиска по нескольким полям, параметры должны быть перечислены через `&`, например: `?field_1=value&field_2=value`.
57
+
58
+ В общем случае, названия полей соответствуют названиями параметров (например поле `name` и параметр `name`).
59
+
60
+ Пример использования с осуществлением поиска по полю `name` с полным совпадением:
61
+
62
+ ```ruby
63
+ get 'users' do
64
+ listing model: User,
65
+ entity: UserEntity,
66
+ search: %w[name]
67
+ end
68
+ ```
69
+ ```
70
+ GET http://localhost:3000/api/users?name=Ivan
71
+ ```
56
72
 
57
73
  ### Сортировка
58
74
 
@@ -58,7 +58,7 @@ module GrapeListing
58
58
  return cached if cached
59
59
 
60
60
  # получение кол-ва записей из запроса к БД
61
- count = @model.merge(@scopes).count(:id)
61
+ count = @model.merge(@scopes).distinct.count(:id)
62
62
 
63
63
  # кеширование кол-ва записей при превышении порогового значения
64
64
  if count >= 1_000
@@ -69,6 +69,13 @@ module GrapeListing
69
69
  end
70
70
 
71
71
  def count_cache_key
72
+ # необходимо убрать параметры offset и page из uri
73
+ uri_path, params = @request_uri.split('?')
74
+ if params
75
+ params = Rack::Utils.parse_query(params).except('offset', 'page')
76
+ @request_uri = params.present? ? "#{uri_path}?#{Rack::Utils.build_query(params)}" : uri_path
77
+ end
78
+
72
79
  # пример: "GET api/v1/users?active=true"
73
80
  body = "#{@request_method} #{@request_uri}"
74
81
 
@@ -19,8 +19,8 @@ module GrapeListing
19
19
  # название скоупа из модели, который нужно применить
20
20
  scope_name = operator.split('.')[1]
21
21
  # применение скоупа
22
- @objects = list.send(scope_name, value)
23
- @objects_count = @objects.count
22
+ @objects = list.send(scope_name, value).distinct
23
+ @objects_count = @objects.distinct.count
24
24
  next
25
25
  end
26
26
 
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.1.8
4
+ version: 1.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Павел Бабин
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-26 00:00:00.000000000 Z
11
+ date: 2024-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack