pg_serializable 1.1.0 → 1.2.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 +5 -5
- data/.gitignore +1 -0
- data/README.md +113 -12
- data/lib/pg_serializable/trait.rb +4 -0
- data/lib/pg_serializable/version.rb +1 -1
- data/lib/pg_serializable/visitors/json.rb +16 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2412f2861f08e20be5822ca7db5557e39017a451c1736bf3833aa2358e20812e
|
4
|
+
data.tar.gz: 5e696c9b943484d1eb2b3f19f1797212ac3593a03cd74c191b9ec410c68000ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2885d036b4e2b81e23444aac10b5edadc5f9a2fab31818b1fdea666a600bc026e199e1d856134045782006512bd24abf4fda0dfb6ae0a69ff2eae0078a5f0741
|
7
|
+
data.tar.gz: 13914aff5bc7e29849b94022f84a8af6b70ea3637cb1034f8848c9192d2ce9c84cc4e56d10e9c59c4767cc4abcb5b2a4708d00819c47daa642b7c1ee5b735b79
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -41,7 +41,7 @@ class Api::ProductsController < ApplicationController
|
|
41
41
|
end
|
42
42
|
```
|
43
43
|
```shell
|
44
|
-
Completed 200 OK in
|
44
|
+
Completed 200 OK in 2975ms (Views: 2944.2ms | ActiveRecord: 29.9ms)
|
45
45
|
```
|
46
46
|
|
47
47
|
Using fast_jsonapi:
|
@@ -51,12 +51,16 @@ class Api::ProductsController < ApplicationController
|
|
51
51
|
@products = Product.limit(200)
|
52
52
|
.order(updated_at: :desc)
|
53
53
|
.includes(:categories, :label, variations: :color)
|
54
|
-
|
54
|
+
options = {
|
55
|
+
include: [:categories, :variations, :label, :'variations.color']
|
56
|
+
}
|
57
|
+
|
58
|
+
render json: ProductSerializer.new(@products, options).serialized_json
|
55
59
|
end
|
56
60
|
end
|
57
61
|
```
|
58
62
|
```shell
|
59
|
-
Completed 200 OK in
|
63
|
+
Completed 200 OK in 542ms (Views: 0.5ms | ActiveRecord: 29.0ms)
|
60
64
|
```
|
61
65
|
|
62
66
|
Using PgSerializable:
|
@@ -68,14 +72,15 @@ class Api::ProductsController < ApplicationController
|
|
68
72
|
end
|
69
73
|
```
|
70
74
|
```shell
|
71
|
-
Completed 200 OK in
|
75
|
+
Completed 200 OK in 54ms (Views: 0.1ms | ActiveRecord: 43.0ms)
|
72
76
|
```
|
73
77
|
|
74
78
|
Benchmarking `fast_jsonapi` against `pg_serializable` on 100 requests:
|
75
79
|
```shell
|
76
80
|
user system total real
|
77
|
-
|
78
|
-
|
81
|
+
jbuilder 175.620000 70.750000 246.370000 (282.967300)
|
82
|
+
fast_jsonapi 37.880000 0.720000 38.600000 ( 48.234853)
|
83
|
+
pg_serializable 1.180000 0.080000 1.260000 ( 4.150280)
|
79
84
|
```
|
80
85
|
|
81
86
|
You'll see the greatest benefits from PgSerializable for deeply nested json objects.
|
@@ -133,7 +138,7 @@ attributes :name, :id
|
|
133
138
|
```
|
134
139
|
results in:
|
135
140
|
```json
|
136
|
-
[
|
141
|
+
[
|
137
142
|
{
|
138
143
|
"id": 503,
|
139
144
|
"name": "Direct Viewer"
|
@@ -233,6 +238,7 @@ Supported associations:
|
|
233
238
|
- `belongs_to`
|
234
239
|
- `has_many`
|
235
240
|
- `has_many :through`
|
241
|
+
- `has_and_belongs_to_many`
|
236
242
|
- `has_one`
|
237
243
|
|
238
244
|
#### belongs_to
|
@@ -240,7 +246,7 @@ Supported associations:
|
|
240
246
|
serializable do
|
241
247
|
default do
|
242
248
|
attributes :id, :name
|
243
|
-
belongs_to
|
249
|
+
belongs_to :label
|
244
250
|
end
|
245
251
|
end
|
246
252
|
```
|
@@ -270,7 +276,7 @@ class Product < ApplicationRecord
|
|
270
276
|
serializable do
|
271
277
|
default do
|
272
278
|
attributes :id, :name
|
273
|
-
has_many
|
279
|
+
has_many :variations
|
274
280
|
end
|
275
281
|
end
|
276
282
|
end
|
@@ -279,7 +285,7 @@ class Variation < ApplicationRecord
|
|
279
285
|
serializable do
|
280
286
|
default do
|
281
287
|
attributes :id, :name
|
282
|
-
belongs_to
|
288
|
+
belongs_to :color
|
283
289
|
end
|
284
290
|
end
|
285
291
|
end
|
@@ -392,8 +398,103 @@ end
|
|
392
398
|
}
|
393
399
|
]
|
394
400
|
```
|
401
|
+
|
402
|
+
#### has_many_and_belongs_to_many
|
403
|
+
```ruby
|
404
|
+
class Product < ApplicationRecord
|
405
|
+
has_and_belongs_to_many :categories
|
406
|
+
|
407
|
+
serializable do
|
408
|
+
default do
|
409
|
+
attributes :id
|
410
|
+
has_and_belongs_to_many :categories
|
411
|
+
end
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
class Category < ApplicationRecord
|
416
|
+
serializable do
|
417
|
+
default do
|
418
|
+
attributes :name, :id
|
419
|
+
end
|
420
|
+
end
|
421
|
+
end
|
422
|
+
```
|
423
|
+
|
424
|
+
```json
|
425
|
+
[
|
426
|
+
{
|
427
|
+
"id": 503,
|
428
|
+
"categories": [
|
429
|
+
{
|
430
|
+
"name": "Juliann",
|
431
|
+
"id": 13
|
432
|
+
},
|
433
|
+
{
|
434
|
+
"name": "Teressa",
|
435
|
+
"id": 176
|
436
|
+
},
|
437
|
+
{
|
438
|
+
"name": "Garret",
|
439
|
+
"id": 294
|
440
|
+
}
|
441
|
+
]
|
442
|
+
},
|
443
|
+
{
|
444
|
+
"id": 502,
|
445
|
+
"categories": [
|
446
|
+
{
|
447
|
+
"name": "Rossana",
|
448
|
+
"id": 254
|
449
|
+
}
|
450
|
+
]
|
451
|
+
}
|
452
|
+
]
|
453
|
+
```
|
454
|
+
|
395
455
|
#### has_one
|
396
|
-
|
456
|
+
|
457
|
+
```ruby
|
458
|
+
class Product < ApplicationRecord
|
459
|
+
has_one :variation
|
460
|
+
|
461
|
+
serializable do
|
462
|
+
default do
|
463
|
+
attributes :name, :id
|
464
|
+
has_one :variation
|
465
|
+
end
|
466
|
+
end
|
467
|
+
end
|
468
|
+
```
|
469
|
+
|
470
|
+
```json
|
471
|
+
[
|
472
|
+
{
|
473
|
+
"name": "GPS Kit",
|
474
|
+
"id": 1003,
|
475
|
+
"variation": {
|
476
|
+
"name": "Gottlieb",
|
477
|
+
"id": 4544,
|
478
|
+
"color": {
|
479
|
+
"id": 756,
|
480
|
+
"hex": "67809b"
|
481
|
+
}
|
482
|
+
}
|
483
|
+
},
|
484
|
+
{
|
485
|
+
"name": "Video Transmitter",
|
486
|
+
"id": 1002,
|
487
|
+
"variation": {
|
488
|
+
"name": "Hessel",
|
489
|
+
"id": 4535,
|
490
|
+
"color": {
|
491
|
+
"id": 111,
|
492
|
+
"hex": "144f9e"
|
493
|
+
}
|
494
|
+
}
|
495
|
+
}
|
496
|
+
]
|
497
|
+
```
|
397
498
|
|
398
499
|
### Association Traits
|
399
500
|
Models:
|
@@ -431,7 +532,7 @@ Controller:
|
|
431
532
|
```ruby
|
432
533
|
render json: Product.limit(3).json(trait: :with_variations)
|
433
534
|
```
|
434
|
-
|
535
|
+
Response:
|
435
536
|
```json
|
436
537
|
[
|
437
538
|
{
|
@@ -28,5 +28,9 @@ module PgSerializable
|
|
28
28
|
def has_one(association, label: nil, trait: :default)
|
29
29
|
@attribute_nodes << Nodes::Association.new(klass, association, :has_one, label: label, trait: trait)
|
30
30
|
end
|
31
|
+
|
32
|
+
def has_and_belongs_to_many(association, label: nil, trait: :default)
|
33
|
+
@attribute_nodes << Nodes::Association.new(klass, association, :has_and_belongs_to_many, label: label, trait: trait)
|
34
|
+
end
|
31
35
|
end
|
32
36
|
end
|
@@ -102,6 +102,22 @@ module PgSerializable
|
|
102
102
|
"\'#{subject.label}\', (#{query})"
|
103
103
|
end
|
104
104
|
|
105
|
+
def visit_has_and_belongs_to_many(subject, table_alias:, **kwargs)
|
106
|
+
current_alias = next_alias!
|
107
|
+
association = subject.association
|
108
|
+
join_table = association.join_table
|
109
|
+
source = association.source_reflection
|
110
|
+
|
111
|
+
query = visit(association
|
112
|
+
.klass
|
113
|
+
.select("#{source.table_name}.*, #{join_table}.#{source.association_foreign_key}, #{join_table}.#{association.join_primary_key}")
|
114
|
+
.joins("INNER JOIN #{join_table} ON #{join_table}.#{source.association_foreign_key}=#{source.table_name}.#{source.association_primary_key}"), table_alias: current_alias)
|
115
|
+
.where("#{current_alias}.#{association.join_primary_key}=#{table_alias}.#{subject.foreign_key}")
|
116
|
+
.to_sql
|
117
|
+
|
118
|
+
"\'#{subject.label}\', (#{query})"
|
119
|
+
end
|
120
|
+
|
105
121
|
def visit_has_one(subject, table_alias:, **kwargs)
|
106
122
|
current_alias = next_alias!
|
107
123
|
subquery_alias = next_alias!
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg_serializable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- matthewjf
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -152,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
152
|
version: '0'
|
153
153
|
requirements: []
|
154
154
|
rubyforge_project:
|
155
|
-
rubygems_version: 2.
|
155
|
+
rubygems_version: 2.7.6
|
156
156
|
signing_key:
|
157
157
|
specification_version: 4
|
158
158
|
summary: serializes rails models from postgres (9.5+)
|