pg_serializable 0.1.0 → 0.1.1
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 +241 -7
- data/lib/pg_serializable/nodes/attribute.rb +13 -2
- data/lib/pg_serializable/serializer.rb +2 -2
- data/lib/pg_serializable/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 618fc576fe1ec96d02b3b6745406aaa0921297a3
|
4
|
+
data.tar.gz: 10fcb8a2866501c48f4126cbbb907f76c64c3b26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c252b339e93bb7e0f544e3bdc80639086a6c2378df48a1d6c7fbf8646c45774048bd0aae5f6177f9485fd7235c7bdedb3ee9c6cd785903b1d044960188ade606
|
7
|
+
data.tar.gz: 0f4d3bd51fcb1255f54cd206477eba8eeeeaddc1bc33194fb5538406233a291d499990f5854f2833fa7599eeff5fe6e694c52c706701c6ec73f39d388bb433d2
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# PgSerializable
|
2
2
|
|
3
|
-
|
3
|
+
This is experimental.
|
4
4
|
|
5
|
-
|
5
|
+
Serialize json directly from postgres (9.4+).
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -22,17 +22,251 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
25
|
+
In your model:
|
26
|
+
```ruby
|
27
|
+
require 'pg_serializable'
|
26
28
|
|
27
|
-
|
29
|
+
class Product < ApplicationRecord
|
30
|
+
include PgSerializable
|
31
|
+
|
32
|
+
serializable do
|
33
|
+
attributes :name, :id
|
34
|
+
attribute :name, label: :test_name
|
35
|
+
end
|
36
|
+
end
|
37
|
+
```
|
38
|
+
|
39
|
+
You can also include it in your `ApplicationRecord` so all models will be serializable.
|
40
|
+
|
41
|
+
In your controller:
|
42
|
+
```ruby
|
43
|
+
render json: Product.limit(200).order(updated_at: :desc).json
|
44
|
+
```
|
45
|
+
|
46
|
+
It works with single records:
|
47
|
+
```ruby
|
48
|
+
render json: Product.find(10).json
|
49
|
+
```
|
50
|
+
|
51
|
+
### Attributes
|
52
|
+
List attributes:
|
53
|
+
```ruby
|
54
|
+
attributes :name, :id
|
55
|
+
```
|
56
|
+
results in:
|
57
|
+
```json
|
58
|
+
[
|
59
|
+
{
|
60
|
+
"id": 503,
|
61
|
+
"name": "Direct Viewer"
|
62
|
+
},
|
63
|
+
{
|
64
|
+
"id": 502,
|
65
|
+
"name": "Side Disc Bracket"
|
66
|
+
}
|
67
|
+
]
|
68
|
+
```
|
69
|
+
Re-label individual attributes:
|
70
|
+
```ruby
|
71
|
+
attributes :id
|
72
|
+
attribute :name, label: :different_name
|
73
|
+
```
|
74
|
+
```json
|
75
|
+
[
|
76
|
+
{
|
77
|
+
"id": 503,
|
78
|
+
"different_name": "Direct Viewer"
|
79
|
+
},
|
80
|
+
{
|
81
|
+
"id": 502,
|
82
|
+
"different_name": "Side Disc Bracket"
|
83
|
+
}
|
84
|
+
]
|
85
|
+
```
|
86
|
+
|
87
|
+
Wrap attributes in custom sql
|
88
|
+
```ruby
|
89
|
+
serializable do
|
90
|
+
attributes :id
|
91
|
+
attribute :active, label: :deleted { |v| "NOT #{v}" }
|
92
|
+
end
|
93
|
+
```
|
94
|
+
```json
|
95
|
+
[
|
96
|
+
{
|
97
|
+
"id": 503,
|
98
|
+
"deleted": true
|
99
|
+
},
|
100
|
+
{
|
101
|
+
"id": 502,
|
102
|
+
"deleted": true
|
103
|
+
}
|
104
|
+
]
|
105
|
+
```
|
106
|
+
|
107
|
+
|
108
|
+
### Associations
|
109
|
+
Supported associations:
|
110
|
+
- `belongs_to`
|
111
|
+
- `has_many`
|
112
|
+
- `has_many :through`
|
113
|
+
- `has_one`
|
28
114
|
|
29
|
-
|
115
|
+
#### belongs_to
|
116
|
+
```ruby
|
117
|
+
serializable do
|
118
|
+
attributes :id, :name
|
119
|
+
belongs_to: :label
|
120
|
+
end
|
121
|
+
```
|
122
|
+
```json
|
123
|
+
[
|
124
|
+
{
|
125
|
+
"id": 503,
|
126
|
+
"label": {
|
127
|
+
"name": "Piper",
|
128
|
+
"id": 106
|
129
|
+
}
|
130
|
+
},
|
131
|
+
{
|
132
|
+
"id": 502,
|
133
|
+
"label": {
|
134
|
+
"name": "Sebrina",
|
135
|
+
"id": 77
|
136
|
+
}
|
137
|
+
}
|
138
|
+
]
|
139
|
+
```
|
140
|
+
|
141
|
+
#### has_many
|
142
|
+
Works for nested relationships
|
143
|
+
```ruby
|
144
|
+
class Product < ApplicationRecord
|
145
|
+
serializable do
|
146
|
+
attributes :id, :name
|
147
|
+
has_many: :variations
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class Variation < ApplicationRecord
|
152
|
+
serializable do
|
153
|
+
attributes :id, :hex
|
154
|
+
belongs_to: :color
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
class Color < ApplicationRecord
|
159
|
+
serializable do
|
160
|
+
attributes :id, :hex
|
161
|
+
end
|
162
|
+
end
|
163
|
+
```
|
164
|
+
```json
|
165
|
+
[
|
166
|
+
{
|
167
|
+
"id": 503,
|
168
|
+
"variations": [
|
169
|
+
{
|
170
|
+
"name": "Cormier",
|
171
|
+
"id": 2272,
|
172
|
+
"color": {
|
173
|
+
"id": 5,
|
174
|
+
"hex": "f4b9c8"
|
175
|
+
}
|
176
|
+
},
|
177
|
+
{
|
178
|
+
"name": "Spencer",
|
179
|
+
"id": 2271,
|
180
|
+
"color": {
|
181
|
+
"id": 586,
|
182
|
+
"hex": "2e0719"
|
183
|
+
}
|
184
|
+
}
|
185
|
+
]
|
186
|
+
},
|
187
|
+
{
|
188
|
+
"id": 502,
|
189
|
+
"variations": [
|
190
|
+
{
|
191
|
+
"name": "DuBuque",
|
192
|
+
"id": 2270,
|
193
|
+
"color": {
|
194
|
+
"id": 593,
|
195
|
+
"hex": "0b288f"
|
196
|
+
}
|
197
|
+
},
|
198
|
+
{
|
199
|
+
"name": "Berge",
|
200
|
+
"id": 2269,
|
201
|
+
"color": {
|
202
|
+
"id": 536,
|
203
|
+
"hex": "b2bfee"
|
204
|
+
}
|
205
|
+
}
|
206
|
+
]
|
207
|
+
}
|
208
|
+
]
|
209
|
+
```
|
210
|
+
|
211
|
+
#### has_many :through
|
212
|
+
```ruby
|
213
|
+
class Product < ApplicationRecord
|
214
|
+
has_many :categories_products
|
215
|
+
has_many :categories, through: :categories_products
|
216
|
+
|
217
|
+
serializable do
|
218
|
+
attributes :id
|
219
|
+
has_many :categories
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
class Category < ApplicationRecord
|
224
|
+
serializable do
|
225
|
+
attributes :name, :id
|
226
|
+
end
|
227
|
+
end
|
228
|
+
```
|
229
|
+
|
230
|
+
```json
|
231
|
+
[
|
232
|
+
{
|
233
|
+
"id": 503,
|
234
|
+
"categories": [
|
235
|
+
{
|
236
|
+
"name": "Juliann",
|
237
|
+
"id": 13
|
238
|
+
},
|
239
|
+
{
|
240
|
+
"name": "Teressa",
|
241
|
+
"id": 176
|
242
|
+
},
|
243
|
+
{
|
244
|
+
"name": "Garret",
|
245
|
+
"id": 294
|
246
|
+
}
|
247
|
+
]
|
248
|
+
},
|
249
|
+
{
|
250
|
+
"id": 502,
|
251
|
+
"categories": [
|
252
|
+
{
|
253
|
+
"name": "Rossana",
|
254
|
+
"id": 254
|
255
|
+
}
|
256
|
+
]
|
257
|
+
}
|
258
|
+
]
|
259
|
+
```
|
260
|
+
#### has_one
|
261
|
+
TODO: write examples
|
262
|
+
|
263
|
+
## Development
|
30
264
|
|
31
|
-
|
265
|
+
TODO
|
32
266
|
|
33
267
|
## Contributing
|
34
268
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
269
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/matthewjf/pg_serializable. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
36
270
|
|
37
271
|
## License
|
38
272
|
|
@@ -1,13 +1,24 @@
|
|
1
1
|
module PgSerializable
|
2
2
|
module Nodes
|
3
3
|
class Attribute < Base
|
4
|
-
def initialize(column_name, label: nil)
|
4
|
+
def initialize(column_name, label: nil, &prc)
|
5
5
|
@column_name = column_name
|
6
6
|
@label = label || column_name
|
7
|
+
@prc = prc if block_given?
|
7
8
|
end
|
8
9
|
|
9
10
|
def to_sql(table_alias=nil)
|
10
|
-
[
|
11
|
+
[key, value(table_alias)].join(',')
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def key
|
16
|
+
"\'#{@label}\'"
|
17
|
+
end
|
18
|
+
|
19
|
+
def value(tbl)
|
20
|
+
val = "#{tbl && "#{tbl}."}#{@column_name}"
|
21
|
+
@prc ? @prc.call(val) : val
|
11
22
|
end
|
12
23
|
end
|
13
24
|
end
|
@@ -13,8 +13,8 @@ module PgSerializable
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
def attribute(column_name, label: nil)
|
17
|
-
@attributes << Nodes::Attribute.new(column_name, label: label) if column_exists?(column_name)
|
16
|
+
def attribute(column_name, label: nil, &blk)
|
17
|
+
@attributes << Nodes::Attribute.new(column_name, label: label, &blk) if column_exists?(column_name)
|
18
18
|
end
|
19
19
|
|
20
20
|
def has_many(association, label: nil)
|