active_model_serializers 0.10.0 → 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -2
- data/Gemfile +1 -1
- data/README.md +21 -24
- data/active_model_serializers.gemspec +4 -8
- data/docs/general/adapters.md +4 -2
- data/docs/general/configuration_options.md +6 -1
- data/docs/general/deserialization.md +1 -1
- data/docs/general/serializers.md +30 -3
- data/docs/jsonapi/schema.md +1 -1
- data/lib/active_model/serializer.rb +54 -11
- data/lib/active_model/serializer/adapter/base.rb +2 -0
- data/lib/active_model/serializer/associations.rb +4 -5
- data/lib/active_model/serializer/belongs_to_reflection.rb +0 -3
- data/lib/active_model/serializer/caching.rb +62 -110
- data/lib/active_model/serializer/collection_serializer.rb +30 -10
- data/lib/active_model/serializer/configuration.rb +1 -0
- data/lib/active_model/serializer/has_many_reflection.rb +0 -3
- data/lib/active_model/serializer/has_one_reflection.rb +0 -3
- data/lib/active_model/serializer/reflection.rb +3 -3
- data/lib/active_model/serializer/version.rb +1 -1
- data/lib/active_model_serializers.rb +6 -0
- data/lib/active_model_serializers/adapter.rb +6 -0
- data/lib/active_model_serializers/adapter/attributes.rb +2 -67
- data/lib/active_model_serializers/adapter/base.rb +38 -38
- data/lib/active_model_serializers/adapter/json_api.rb +36 -28
- data/lib/active_model_serializers/adapter/json_api/link.rb +1 -1
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +8 -1
- data/lib/active_model_serializers/deprecate.rb +1 -2
- data/lib/active_model_serializers/deserialization.rb +2 -0
- data/lib/active_model_serializers/model.rb +2 -0
- data/lib/active_model_serializers/railtie.rb +2 -0
- data/lib/active_model_serializers/register_jsonapi_renderer.rb +34 -23
- data/lib/active_model_serializers/serialization_context.rb +10 -3
- data/lib/grape/formatters/active_model_serializers.rb +19 -2
- data/lib/grape/helpers/active_model_serializers.rb +1 -0
- data/test/action_controller/adapter_selector_test.rb +1 -1
- data/test/action_controller/explicit_serializer_test.rb +5 -4
- data/test/action_controller/json/include_test.rb +106 -27
- data/test/action_controller/json_api/errors_test.rb +2 -2
- data/test/action_controller/json_api/linked_test.rb +26 -21
- data/test/action_controller/serialization_test.rb +9 -6
- data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +143 -0
- data/test/active_model_serializers/serialization_context_test_isolated.rb +23 -10
- data/test/adapter/json/collection_test.rb +14 -0
- data/test/adapter/json_api/collection_test.rb +4 -3
- data/test/adapter/json_api/errors_test.rb +13 -15
- data/test/adapter/json_api/linked_test.rb +8 -5
- data/test/adapter/json_api/links_test.rb +3 -1
- data/test/adapter/json_api/pagination_links_test.rb +13 -1
- data/test/adapter/json_api/relationships_test.rb +9 -4
- data/test/adapter/json_api/resource_identifier_test.rb +7 -2
- data/test/adapter/json_api/transform_test.rb +76 -75
- data/test/adapter/json_test.rb +4 -3
- data/test/benchmark/app.rb +1 -1
- data/test/benchmark/bm_caching.rb +14 -14
- data/test/benchmark/bm_transform.rb +16 -5
- data/test/benchmark/controllers.rb +16 -17
- data/test/benchmark/fixtures.rb +72 -72
- data/test/cache_test.rb +73 -45
- data/test/fixtures/poro.rb +6 -5
- data/test/grape_test.rb +96 -2
- data/test/serializable_resource_test.rb +12 -12
- data/test/serializers/meta_test.rb +12 -6
- data/test/support/isolated_unit.rb +1 -0
- data/test/support/rails5_shims.rb +8 -2
- data/test/support/rails_app.rb +0 -9
- metadata +53 -23
- data/lib/active_model/serializer/include_tree.rb +0 -111
- data/test/include_tree/from_include_args_test.rb +0 -26
- data/test/include_tree/from_string_test.rb +0 -94
- data/test/include_tree/include_args_to_hash_test.rb +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01b7ca6e2acce14a076a2a63c87dc6d4677989dc
|
4
|
+
data.tar.gz: e04babe194acff0c4a0fd2b1daec6ee5128d8b8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b4a986b9ab49ec7962be0ff855c9c3d2504e55743b8ba5cbbb22fdb936704456d5033160ab52d5efc2537a248f18de636aaafc7d5ec9c8a29a5e027f1c39063
|
7
|
+
data.tar.gz: d824f39238f997d1fd763f8cb8d6ce158209a7d4c3ab5de3ea5294d991e5f2a6a1dca6a2be090bc69195ed58506ae54e5934f61440095ab2a749a948397a6937
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,36 @@
|
|
1
1
|
## 0.10.x
|
2
2
|
|
3
|
-
### [master (unreleased)](https://github.com/rails-api/active_model_serializers/compare/v0.10.
|
3
|
+
### [master (unreleased)](https://github.com/rails-api/active_model_serializers/compare/v0.10.1...master)
|
4
4
|
|
5
|
-
|
5
|
+
Breaking changes:
|
6
|
+
|
7
|
+
Features:
|
8
|
+
|
9
|
+
Fixes:
|
10
|
+
|
11
|
+
Misc:
|
12
|
+
|
13
|
+
### [v0.10.1 (2016-06-16)](https://github.com/rails-api/active_model_serializers/compare/v0.10.0...v0.10.1)
|
14
|
+
|
15
|
+
Features:
|
16
|
+
- [#1668](https://github.com/rails-api/active_model_serializers/pull/1668) Exclude nil and empty links. (@sigmike)
|
17
|
+
- [#1426](https://github.com/rails-api/active_model_serializers/pull/1426) Add ActiveModelSerializers.config.default_includes (@empact)
|
18
|
+
|
19
|
+
Fixes:
|
20
|
+
- [#1754](https://github.com/rails-api/active_model_serializers/pull/1754) Fixes #1759, Grape integration, improves serialization_context
|
21
|
+
missing error message on pagination. Document overriding CollectionSerializer#paginated?. (@bf4)
|
22
|
+
Moved serialization_context creation to Grape formatter, so resource serialization works without explicit calls to the `render` helper method.
|
23
|
+
Added Grape collection tests. (@onomated)
|
24
|
+
- [#1287](https://github.com/rails-api/active_model_serializers/pull/1287) Pass `fields` options from adapter to serializer. (@vasilakisfil)
|
25
|
+
- [#1710](https://github.com/rails-api/active_model_serializers/pull/1710) Prevent association loading when `include_data` option
|
26
|
+
is set to `false`. (@groyoh)
|
27
|
+
- [#1747](https://github.com/rails-api/active_model_serializers/pull/1747) Improve jsonapi mime type registration for Rails 5 (@remear)
|
28
|
+
|
29
|
+
Misc:
|
30
|
+
- [#1734](https://github.com/rails-api/active_model_serializers/pull/1734) Adds documentation for conditional attribute (@lambda2)
|
31
|
+
- [#1685](https://github.com/rails-api/active_model_serializers/pull/1685) Replace `IncludeTree` with `IncludeDirective` from the jsonapi gem.
|
32
|
+
|
33
|
+
### [v0.10.0 (2016-05-17)](https://github.com/rails-api/active_model_serializers/compare/4a2d9853ba7...v0.10.0)
|
6
34
|
|
7
35
|
Breaking changes:
|
8
36
|
- [#1662](https://github.com/rails-api/active_model_serializers/pull/1662) Drop support for Rails 4.0 and Ruby 2.0.0. (@remear)
|
@@ -22,6 +50,7 @@ Fixes:
|
|
22
50
|
|
23
51
|
Misc:
|
24
52
|
- [#1673](https://github.com/rails-api/active_model_serializers/pull/1673) Adds "How to" guide on using AMS with POROs (@DrSayre)
|
53
|
+
- [#1730](https://github.com/rails-api/active_model_serializers/pull/1730) Adds documentation for overriding default serializer based on conditions (@groyoh/@cgmckeever)
|
25
54
|
|
26
55
|
### [v0.10.0.rc5 (2016-04-04)](https://github.com/rails-api/active_model_serializers/compare/v0.10.0.rc4...v0.10.0.rc5)
|
27
56
|
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -24,17 +24,6 @@
|
|
24
24
|
</tr>
|
25
25
|
</table>
|
26
26
|
|
27
|
-
|
28
|
-
## Documentation
|
29
|
-
|
30
|
-
- [0.10 (master) Documentation](https://github.com/rails-api/active_model_serializers/tree/master)
|
31
|
-
- [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/v0.10.0)
|
32
|
-
- [Guides](docs)
|
33
|
-
- [0.9 (0-9-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-9-stable)
|
34
|
-
- [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-9-stable)
|
35
|
-
- [0.8 (0-8-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-8-stable)
|
36
|
-
- [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-8-stable)
|
37
|
-
|
38
27
|
## About
|
39
28
|
|
40
29
|
ActiveModelSerializers brings convention over configuration to your JSON generation.
|
@@ -50,33 +39,24 @@ resource serialization. The serialization has the `#as_json`, `#to_json` and `#s
|
|
50
39
|
methods used by the Rails JSON Renderer. (SerializableResource actually delegates
|
51
40
|
these methods to the adapter.)
|
52
41
|
|
53
|
-
By default ActiveModelSerializers will use the **Attributes Adapter
|
42
|
+
By default ActiveModelSerializers will use the **Attributes Adapter** (no JSON root).
|
54
43
|
But we strongly advise you to use **JsonApi Adapter**, which
|
55
44
|
follows 1.0 of the format specified in [jsonapi.org/format](http://jsonapi.org/format).
|
56
45
|
Check how to change the adapter in the sections below.
|
57
46
|
|
58
|
-
## RELEASE CANDIDATE, PLEASE READ
|
59
|
-
|
60
|
-
This is the **master** branch of ActiveModelSerializers.
|
61
|
-
|
62
|
-
It will become the `0.10.0` release when it's ready. Currently this is a release candidate.
|
63
|
-
|
64
47
|
`0.10.x` is **not** backward compatible with `0.9.x` nor `0.8.x`.
|
65
48
|
|
66
|
-
`0.10.x`
|
49
|
+
`0.10.x` is based on the `0.8.0` code, but with a more flexible
|
67
50
|
architecture. We'd love your help. [Learn how you can help here.](CONTRIBUTING.md)
|
68
51
|
|
69
52
|
It is generally safe and recommended to use the master branch.
|
70
53
|
|
71
|
-
For more information, see the post '[The future of
|
72
|
-
AMS](https://medium.com/@joaomdmoura/the-future-of-ams-e5f9047ca7e9)'.
|
73
|
-
|
74
54
|
## Installation
|
75
55
|
|
76
56
|
Add this line to your application's Gemfile:
|
77
57
|
|
78
58
|
```
|
79
|
-
gem 'active_model_serializers'
|
59
|
+
gem 'active_model_serializers', '~> 0.10.0'
|
80
60
|
```
|
81
61
|
|
82
62
|
And then execute:
|
@@ -103,8 +83,25 @@ If you'd like to chat, we have a [community slack](http://amserializers.herokuap
|
|
103
83
|
|
104
84
|
Thanks!
|
105
85
|
|
86
|
+
## Documentation
|
87
|
+
|
88
|
+
- [0.10 (master) Documentation](https://github.com/rails-api/active_model_serializers/tree/master)
|
89
|
+
- [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/v0.10.0)
|
90
|
+
- [Guides](docs)
|
91
|
+
- [0.9 (0-9-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-9-stable)
|
92
|
+
- [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-9-stable)
|
93
|
+
- [0.8 (0-8-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-8-stable)
|
94
|
+
- [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-8-stable)
|
95
|
+
|
96
|
+
|
106
97
|
## High-level behavior
|
107
98
|
|
99
|
+
Choose an adapter from [adapters](lib/active_model_serializers/adapter):
|
100
|
+
|
101
|
+
``` ruby
|
102
|
+
ActiveModelSerializers.config.adapter = :json_api # Default: `:attributes`
|
103
|
+
```
|
104
|
+
|
108
105
|
Given a [serializable model](lib/active_model/serializer/lint.rb):
|
109
106
|
|
110
107
|
```ruby
|
@@ -162,6 +159,6 @@ serializer.associations
|
|
162
159
|
```
|
163
160
|
See [ARCHITECTURE.md](docs/ARCHITECTURE.md) for more information.
|
164
161
|
|
165
|
-
|
162
|
+
## Contributing
|
166
163
|
|
167
164
|
See [CONTRIBUTING.md](CONTRIBUTING.md)
|
@@ -19,9 +19,9 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
spec.executables = []
|
21
21
|
|
22
|
-
spec.required_ruby_version = '>= 2.
|
22
|
+
spec.required_ruby_version = '>= 2.1'
|
23
23
|
|
24
|
-
rails_versions = '>= 4.
|
24
|
+
rails_versions = ['>= 4.1', '< 6']
|
25
25
|
spec.add_runtime_dependency 'activemodel', rails_versions
|
26
26
|
# 'activesupport', rails_versions
|
27
27
|
# 'builder'
|
@@ -42,6 +42,8 @@ Gem::Specification.new do |spec|
|
|
42
42
|
# 'minitest'
|
43
43
|
# 'thread_safe'
|
44
44
|
|
45
|
+
spec.add_runtime_dependency 'jsonapi', '~> 0.1.1.beta2'
|
46
|
+
|
45
47
|
spec.add_development_dependency 'activerecord', rails_versions
|
46
48
|
# arel
|
47
49
|
# activesupport
|
@@ -57,10 +59,4 @@ Gem::Specification.new do |spec|
|
|
57
59
|
spec.add_development_dependency 'grape', ['>= 0.13', '< 1.0']
|
58
60
|
spec.add_development_dependency 'json_schema'
|
59
61
|
spec.add_development_dependency 'rake', ['>= 10.0', '< 12.0']
|
60
|
-
|
61
|
-
spec.post_install_message = <<-EOF
|
62
|
-
NOTE: The default key case for the JsonApi adapter has changed to dashed.
|
63
|
-
See https://github.com/rails-api/active_model_serializers/blob/master/docs/general/key_transforms.md
|
64
|
-
for more information on configuring this behavior.
|
65
|
-
EOF
|
66
62
|
end
|
data/docs/general/adapters.md
CHANGED
@@ -67,9 +67,11 @@ Doesn't follow any specific convention.
|
|
67
67
|
|
68
68
|
### JSON
|
69
69
|
|
70
|
-
The response
|
70
|
+
The json response is always rendered with a root key.
|
71
71
|
|
72
|
-
The root key
|
72
|
+
The root key can be overridden by:
|
73
|
+
* passing the `root` option in the render call. See details in the [Rendering Guides](rendering.md#overriding-the-root-key).
|
74
|
+
* setting the `type` of the serializer. See details in the [Serializers Guide](serializers.md#type).
|
73
75
|
|
74
76
|
Doesn't follow any specific convention.
|
75
77
|
|
@@ -52,9 +52,14 @@ Each adapter has a default key transform configured:
|
|
52
52
|
`config.key_transform` is a global override of the adapter default. Adapters
|
53
53
|
still prefer the render option `:key_transform` over this setting.
|
54
54
|
|
55
|
+
*NOTE: Key transforms can be expensive operations. If key transforms are unnecessary for the
|
56
|
+
application, setting `config.key_transform` to `:unaltered` will provide a performance boost.*
|
55
57
|
|
56
|
-
|
58
|
+
##### default_includes
|
59
|
+
What relationships to serialize by default. Default: `'*'`, which includes one level of related
|
60
|
+
objects. See [includes](adapters.md#included) for more info.
|
57
61
|
|
62
|
+
## JSON API
|
58
63
|
|
59
64
|
##### jsonapi_resource_type
|
60
65
|
|
data/docs/general/serializers.md
CHANGED
@@ -31,10 +31,21 @@ Serialization of the resource `title`
|
|
31
31
|
|---------------------------- |-------------|
|
32
32
|
| `attribute :title` | `{ title: 'Some Title' } `
|
33
33
|
| `attribute :title, key: :name` | `{ name: 'Some Title' } `
|
34
|
-
| `attribute
|
34
|
+
| `attribute(:title) { 'A Different Title'}` | `{ title: 'A Different Title' } `
|
35
35
|
| `attribute :title`<br>`def title 'A Different Title' end` | `{ title: 'A Different Title' }`
|
36
36
|
|
37
|
-
|
37
|
+
An `if` or `unless` option can make an attribute conditional. It takes a symbol of a method name on the serializer, or a lambda literal.
|
38
|
+
|
39
|
+
e.g.
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
attribute :private_data, if: :is_current_user?
|
43
|
+
attribute :another_private_data, if: -> { scope.admin? }
|
44
|
+
|
45
|
+
def is_current_user?
|
46
|
+
object.id == current_user.id
|
47
|
+
end
|
48
|
+
```
|
38
49
|
|
39
50
|
### Associations
|
40
51
|
|
@@ -255,7 +266,7 @@ In the controller, the scope/scope_name options are equal to
|
|
255
266
|
the [`serialization_scope`method](https://github.com/rails-api/active_model_serializers/blob/d02cd30fe55a3ea85e1d351b6e039620903c1871/lib/action_controller/serialization.rb#L13-L20),
|
256
267
|
which is `:current_user`, by default.
|
257
268
|
|
258
|
-
|
269
|
+
Specifically, the `scope_name` is defaulted to `:current_user`, and may be set as
|
259
270
|
`serialization_scope :view_context`. The `scope` is set to `send(scope_name)` when `scope_name` is
|
260
271
|
present and the controller responds to `scope_name`.
|
261
272
|
|
@@ -370,3 +381,19 @@ class PostSerializer < ActiveModel::Serializer
|
|
370
381
|
end
|
371
382
|
end
|
372
383
|
```
|
384
|
+
|
385
|
+
## Overriding association serializer lookup
|
386
|
+
|
387
|
+
If you want to define a specific serializer lookup for your associations, you can override
|
388
|
+
the `ActiveModel::Serializer.serializer_for` method to return a serializer class based on defined conditions.
|
389
|
+
|
390
|
+
```ruby
|
391
|
+
class MySerializer < ActiveModel::Serializer
|
392
|
+
def self.serializer_for(model, options)
|
393
|
+
return SparseAdminSerializer if model.class == 'Admin'
|
394
|
+
super
|
395
|
+
end
|
396
|
+
|
397
|
+
# the rest of the serializer
|
398
|
+
end
|
399
|
+
```
|
data/docs/jsonapi/schema.md
CHANGED
@@ -28,7 +28,7 @@ Example supported requests
|
|
28
28
|
- Relationships
|
29
29
|
- GET /articles/1/relationships/comments
|
30
30
|
- GET /articles/1/relationships/author
|
31
|
-
- Optional: [Inclusion of related resources](http://jsonapi.org/format/#fetching-includes) `
|
31
|
+
- Optional: [Inclusion of related resources](http://jsonapi.org/format/#fetching-includes) `JSONAPI::IncludeDirective`
|
32
32
|
- GET /articles/1?`include`=comments
|
33
33
|
- GET /articles/1?`include`=comments.author
|
34
34
|
- GET /articles/1?`include`=author,comments.author
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'thread_safe'
|
2
|
+
require 'jsonapi/include_directive'
|
2
3
|
require 'active_model/serializer/collection_serializer'
|
3
4
|
require 'active_model/serializer/array_serializer'
|
4
5
|
require 'active_model/serializer/error_serializer'
|
5
6
|
require 'active_model/serializer/errors_serializer'
|
6
|
-
require 'active_model/serializer/include_tree'
|
7
7
|
require 'active_model/serializer/associations'
|
8
8
|
require 'active_model/serializer/attributes'
|
9
9
|
require 'active_model/serializer/caching'
|
@@ -98,6 +98,22 @@ module ActiveModel
|
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
101
|
+
# @api private
|
102
|
+
def self.include_directive_from_options(options)
|
103
|
+
if options[:include_directive]
|
104
|
+
options[:include_directive]
|
105
|
+
elsif options[:include]
|
106
|
+
JSONAPI::IncludeDirective.new(options[:include], allow_wildcard: true)
|
107
|
+
else
|
108
|
+
ActiveModelSerializers.default_include_directive
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# @api private
|
113
|
+
def self.serialization_adapter_instance
|
114
|
+
@serialization_adapter_instance ||= ActiveModelSerializers::Adapter::Attributes
|
115
|
+
end
|
116
|
+
|
101
117
|
attr_accessor :object, :root, :scope
|
102
118
|
|
103
119
|
# `scope_name` is set as :current_user by default in the controller.
|
@@ -123,9 +139,7 @@ module ActiveModel
|
|
123
139
|
# associations, similar to how ActiveModel::Serializers::JSON is used
|
124
140
|
# in ActiveRecord::Base.
|
125
141
|
#
|
126
|
-
# TODO:
|
127
|
-
# +serializable_hash_for_single_resource(options)+
|
128
|
-
# and include <tt>ActiveModel::Serializers::JSON</tt>.
|
142
|
+
# TODO: Include <tt>ActiveModel::Serializers::JSON</tt>.
|
129
143
|
# So that the below is true:
|
130
144
|
# @param options [nil, Hash] The same valid options passed to `serializable_hash`
|
131
145
|
# (:only, :except, :methods, and :include).
|
@@ -149,11 +163,13 @@ module ActiveModel
|
|
149
163
|
# serializer.as_json(include: :posts)
|
150
164
|
# # Second level and higher order associations work as well:
|
151
165
|
# serializer.as_json(include: { posts: { include: { comments: { only: :body } }, only: :title } })
|
152
|
-
def serializable_hash(
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
166
|
+
def serializable_hash(adapter_options = nil, options = {}, adapter_instance = self.class.serialization_adapter_instance)
|
167
|
+
adapter_options ||= {}
|
168
|
+
options[:include_directive] ||= ActiveModel::Serializer.include_directive_from_options(adapter_options)
|
169
|
+
cached_attributes = adapter_options[:cached_attributes] ||= {}
|
170
|
+
resource = fetch_attributes(options[:fields], cached_attributes, adapter_instance)
|
171
|
+
relationships = resource_relationships(adapter_options, options, adapter_instance)
|
172
|
+
resource.merge(relationships)
|
157
173
|
end
|
158
174
|
alias to_hash serializable_hash
|
159
175
|
alias to_h serializable_hash
|
@@ -178,13 +194,40 @@ module ActiveModel
|
|
178
194
|
def read_attribute_for_serialization(attr)
|
179
195
|
if respond_to?(attr)
|
180
196
|
send(attr)
|
181
|
-
elsif self.class._fragmented
|
182
|
-
self.class._fragmented.read_attribute_for_serialization(attr)
|
183
197
|
else
|
184
198
|
object.read_attribute_for_serialization(attr)
|
185
199
|
end
|
186
200
|
end
|
187
201
|
|
202
|
+
# @api private
|
203
|
+
def resource_relationships(adapter_options, options, adapter_instance)
|
204
|
+
relationships = {}
|
205
|
+
include_directive = options.fetch(:include_directive)
|
206
|
+
associations(include_directive).each do |association|
|
207
|
+
adapter_opts = adapter_options.merge(include_directive: include_directive[association.key])
|
208
|
+
relationships[association.key] ||= relationship_value_for(association, adapter_opts, adapter_instance)
|
209
|
+
end
|
210
|
+
|
211
|
+
relationships
|
212
|
+
end
|
213
|
+
|
214
|
+
# @api private
|
215
|
+
def relationship_value_for(association, adapter_options, adapter_instance)
|
216
|
+
return association.options[:virtual_value] if association.options[:virtual_value]
|
217
|
+
association_serializer = association.serializer
|
218
|
+
association_object = association_serializer && association_serializer.object
|
219
|
+
return unless association_object
|
220
|
+
|
221
|
+
relationship_value = association_serializer.serializable_hash(adapter_options, {}, adapter_instance)
|
222
|
+
|
223
|
+
if association.options[:polymorphic] && relationship_value
|
224
|
+
polymorphic_type = association_object.class.name.underscore
|
225
|
+
relationship_value = { type: polymorphic_type, polymorphic_type.to_sym => relationship_value }
|
226
|
+
end
|
227
|
+
|
228
|
+
relationship_value
|
229
|
+
end
|
230
|
+
|
188
231
|
protected
|
189
232
|
|
190
233
|
attr_accessor :instance_options
|
@@ -7,9 +7,11 @@ module ActiveModel
|
|
7
7
|
deprecate :inherited, 'ActiveModelSerializers::Adapter::Base.'
|
8
8
|
end
|
9
9
|
|
10
|
+
# :nocov:
|
10
11
|
def initialize(serializer, options = {})
|
11
12
|
super(ActiveModelSerializers::Adapter::Base.new(serializer, options))
|
12
13
|
end
|
14
|
+
# :nocov:
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
@@ -10,8 +10,6 @@ module ActiveModel
|
|
10
10
|
module Associations
|
11
11
|
extend ActiveSupport::Concern
|
12
12
|
|
13
|
-
DEFAULT_INCLUDE_TREE = ActiveModel::Serializer::IncludeTree.from_string('*')
|
14
|
-
|
15
13
|
included do
|
16
14
|
with_options instance_writer: false, instance_reader: true do |serializer|
|
17
15
|
serializer.class_attribute :_reflections
|
@@ -80,17 +78,18 @@ module ActiveModel
|
|
80
78
|
end
|
81
79
|
end
|
82
80
|
|
83
|
-
# @param [
|
81
|
+
# @param [JSONAPI::IncludeDirective] include_directive (defaults to the
|
82
|
+
# +default_include_directive+ config value when not provided)
|
84
83
|
# @return [Enumerator<Association>]
|
85
84
|
#
|
86
|
-
def associations(
|
85
|
+
def associations(include_directive = ActiveModelSerializers.default_include_directive)
|
87
86
|
return unless object
|
88
87
|
|
89
88
|
Enumerator.new do |y|
|
90
89
|
self.class._reflections.each do |reflection|
|
91
90
|
next if reflection.excluded?(self)
|
92
91
|
key = reflection.options.fetch(:key, reflection.name)
|
93
|
-
next unless
|
92
|
+
next unless include_directive.key?(key)
|
94
93
|
y.yield reflection.build_association(self, instance_options)
|
95
94
|
end
|
96
95
|
end
|