paginated 1.0.4.2 → 1.0.5
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 +4 -4
- data/README.md +15 -4
- data/lib/paginated/serialization.rb +1 -33
- data/lib/paginated/sorting.rb +12 -0
- data/lib/paginated.rb +6 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22aa1b0f64b6566bb94bfb250518c8e18a668c1ca3e16b73ebbc7ab7e1cd74fc
|
4
|
+
data.tar.gz: e40ee2dc208873e2ea18b9798dbae255b6a536dbf279cae50c9a33e3eaa3e1c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3454f5ddc9bbb5e7a419fdf7617ae0ba69bcd927c5e648227301c919f67ddf347f31ea14b1a49f4f2189c03b5e3fe0f56cc7eb8a3ec347aaa4a893b16a6f8a44
|
7
|
+
data.tar.gz: 51de563f73d7225a37aea2ca3d59b6ac9dcfc8d67774fbf0acaacb7a0a4d37d87b35044963941aac2225a3b7d70a8a427a2b4a7eaea43c42ca40e04ffd31b7ab
|
data/README.md
CHANGED
@@ -33,8 +33,6 @@ Paginated.collection()
|
|
33
33
|
|
34
34
|
`params:` - передаваемые параметры для фильтрации записей.
|
35
35
|
|
36
|
-
`order: :name` - название поля, по которому должна осуществляться сортировка.
|
37
|
-
|
38
36
|
`search: %w[...]` - список полей, по которым должна осуществляться фильтрация (поиск).
|
39
37
|
|
40
38
|
Например:
|
@@ -51,7 +49,20 @@ Paginated.collection(
|
|
51
49
|
name|ilike
|
52
50
|
role|custom.for_role
|
53
51
|
],
|
54
|
-
params
|
55
|
-
order: :name,
|
52
|
+
params:
|
56
53
|
)
|
57
54
|
```
|
55
|
+
|
56
|
+
## Параметры HTTP запроса
|
57
|
+
|
58
|
+
Поиск и сортировка осуществляется путем обработки параметров HTTP запроса.
|
59
|
+
|
60
|
+
Для поиска по полям необходимо передать их в запросе в виде `?field=value`. Для поиска по нескольким полям, параметры должны быть перечислены через `&`, например: `?field_1=value&field_2=value`.
|
61
|
+
|
62
|
+
Для сортировки выдачи необходимо передать в параметрах запроса:
|
63
|
+
|
64
|
+
- `sort_by` - название поля, по которому должна осуществляться сортировка.
|
65
|
+
|
66
|
+
- `sort_order` направление, по которому должна осуществляться сортировка (`asc/desc`).
|
67
|
+
|
68
|
+
По умолчанию сортировка осуществляется по `id` записей в направлении `DESC`.
|
@@ -5,7 +5,7 @@ module Serialization
|
|
5
5
|
private
|
6
6
|
|
7
7
|
def serialize
|
8
|
-
# коллекция записей
|
8
|
+
# коллекция записей ActiveRecord для применения аггрегирования
|
9
9
|
list = @objects || @model.unscoped.merge(@scopes)
|
10
10
|
|
11
11
|
# применение сортировки и пагинации к коллекции записей
|
@@ -34,38 +34,6 @@ module Serialization
|
|
34
34
|
@objects = @objects.map { |i| @grape_entity.represent(i, current_user: @current_user).as_json }
|
35
35
|
end
|
36
36
|
|
37
|
-
def sort_proc
|
38
|
-
# сортировка не задана явно, не передан параметр
|
39
|
-
# или значение переданного параметра не совпадает с ожидаемым
|
40
|
-
if @sort.blank? || @sort.map { |i| i.split('|')[0] }.exclude?(@params[:sort])
|
41
|
-
field = @order
|
42
|
-
return proc { order("#{field} DESC") }
|
43
|
-
end
|
44
|
-
|
45
|
-
@sort.each do |sort_option|
|
46
|
-
sort, field = sort_option.split('|')
|
47
|
-
|
48
|
-
# пропускаем, если поле для сортировки не совпадает с переданным параметром
|
49
|
-
next if @params[:sort] != sort
|
50
|
-
|
51
|
-
# если поле для сортировки совпадает с ключом переданного параметра
|
52
|
-
field = sort if field.blank?
|
53
|
-
|
54
|
-
sort_order = "#{@params[:sort_order]} NULLS LAST"
|
55
|
-
|
56
|
-
order_proc =
|
57
|
-
if field.split('.').count > 1
|
58
|
-
# сортировка по связанной таблице
|
59
|
-
relation, column = field.split('.')
|
60
|
-
proc { eager_load(relation).order("#{relation.tableize}.#{column} #{sort_order}") }
|
61
|
-
else
|
62
|
-
proc { order("#{field} #{sort_order}") }
|
63
|
-
end
|
64
|
-
|
65
|
-
return order_proc
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
37
|
def obtain_fields_values(record)
|
70
38
|
@fields.map { |i| record.send(i) }
|
71
39
|
end
|
data/lib/paginated.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'paginated/search'
|
2
2
|
require 'paginated/serialization'
|
3
|
+
require 'paginated/sorting'
|
3
4
|
|
4
5
|
class Paginated
|
5
6
|
|
6
7
|
include Search
|
7
8
|
include Serialization
|
9
|
+
include Sorting
|
8
10
|
|
9
11
|
def initialize(**args)
|
10
12
|
# обработка переданных аргументов
|
@@ -27,6 +29,8 @@ class Paginated
|
|
27
29
|
{ count: @objects_count, objects: @objects }
|
28
30
|
end
|
29
31
|
|
32
|
+
private
|
33
|
+
|
30
34
|
def handle_args(**args)
|
31
35
|
# обрабатываемая Rails модель
|
32
36
|
@model = args[:model]
|
@@ -51,8 +55,8 @@ class Paginated
|
|
51
55
|
@limit = @params['limit'] || 20
|
52
56
|
|
53
57
|
# сортировка
|
54
|
-
@
|
55
|
-
@
|
58
|
+
@sort_by = @params['sort_by'] || :id
|
59
|
+
@sort_order = @params['sort_order'] || :desc
|
56
60
|
|
57
61
|
# подсчет кол-ва записей
|
58
62
|
@objects_count = records_count
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paginated
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Павел Бабин
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -62,6 +62,7 @@ files:
|
|
62
62
|
- lib/paginated.rb
|
63
63
|
- lib/paginated/search.rb
|
64
64
|
- lib/paginated/serialization.rb
|
65
|
+
- lib/paginated/sorting.rb
|
65
66
|
homepage:
|
66
67
|
licenses:
|
67
68
|
- MIT
|
@@ -81,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
82
|
- !ruby/object:Gem::Version
|
82
83
|
version: '0'
|
83
84
|
requirements: []
|
84
|
-
rubygems_version: 3.
|
85
|
+
rubygems_version: 3.0.6
|
85
86
|
signing_key:
|
86
87
|
specification_version: 4
|
87
88
|
summary: Пагинация для Rails-приложений
|