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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49f9695ec19cbd557cbd15ec981e775e3572371a428e0a6b0ae2abc6803e4201
4
- data.tar.gz: 2f59100f090ccac1c1696d925273f65a2e55de67f5a68cad6f3911700c31f8a0
3
+ metadata.gz: 22aa1b0f64b6566bb94bfb250518c8e18a668c1ca3e16b73ebbc7ab7e1cd74fc
4
+ data.tar.gz: e40ee2dc208873e2ea18b9798dbae255b6a536dbf279cae50c9a33e3eaa3e1c0
5
5
  SHA512:
6
- metadata.gz: 5b0d8b686bbf1ace12b48c1aa7059f6f55b82a2281aa36454eccadefb2814b04977071911f2b11482a79c678537bed0c40ccd18e23f3736e0331cda9b1cd13d4
7
- data.tar.gz: d6e047296b4a80fbdbe756b1f39e64c8ff505a5993d4cc4be713dc0b2b01d39a6ed97851678306f962b7cf06a66b29592a069b377289c2737de54d5f7136f6ef
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
@@ -0,0 +1,12 @@
1
+ module Sorting
2
+
3
+ extend ActiveSupport::Concern
4
+
5
+ private
6
+
7
+ def sort_proc
8
+ query = Arel.sql("#{@sort_by} #{@sort_order} NULLS LAST")
9
+ proc { order(query) }
10
+ end
11
+
12
+ 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
- @order = args[:order] || :id
55
- @sort = args[:sort]
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.2
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-08 00:00:00.000000000 Z
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.4.10
85
+ rubygems_version: 3.0.6
85
86
  signing_key:
86
87
  specification_version: 4
87
88
  summary: Пагинация для Rails-приложений