mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-22 22:06:50 +00:00
Merge pull request #2218 from rails-api/opt_in_belongs_to_uses_foreign_key
Fix 0.10.6 regression; make using belongs_to on self opt-in
This commit is contained in:
commit
c41e243ed8
@ -57,6 +57,7 @@ still prefer the render option `:key_transform` over this setting.
|
||||
application, setting `config.key_transform` to `:unaltered` will provide a performance boost.*
|
||||
|
||||
##### default_includes
|
||||
|
||||
What relationships to serialize by default. Default: `'*'`, which includes one level of related
|
||||
objects. See [includes](adapters.md#included) for more info.
|
||||
|
||||
@ -162,6 +163,21 @@ Default: `{}`.
|
||||
|
||||
*Used when `jsonapi_include_toplevel_object` is `true`*
|
||||
|
||||
##### jsonapi_use_foreign_key_on_belongs_to_relationship
|
||||
|
||||
When true, the relationship will determine its resource object identifier
|
||||
without calling the association or its serializer. This can be useful when calling
|
||||
the association object is triggering unnecessary queries.
|
||||
|
||||
For example, if a `comment` belongs to a `post`, and the comment
|
||||
uses the foreign key `post_id`, we can determine the resource object
|
||||
identifier `id` as `comment.post_id` and the `type` from the association options.
|
||||
Or quite simply, it behaves as `belongs_to :post, type: :posts, foreign_key: :post_id`.
|
||||
|
||||
Note: This option has *no effect* on polymorphic associations as we cannot reliably
|
||||
determine the associated object's type without instantiating it.
|
||||
|
||||
Default: `false`.
|
||||
|
||||
## Hooks
|
||||
|
||||
|
||||
@ -142,6 +142,7 @@ module ActiveModel
|
||||
# Make JSON API top-level jsonapi member opt-in
|
||||
# ref: http://jsonapi.org/format/#document-top-level
|
||||
config.jsonapi_include_toplevel_object = false
|
||||
config.jsonapi_use_foreign_key_on_belongs_to_relationship = false
|
||||
config.include_data_default = true
|
||||
|
||||
# For configuring how serializers are found.
|
||||
|
||||
@ -94,6 +94,7 @@ module ActiveModelSerializers
|
||||
end
|
||||
|
||||
def belongs_to_id_on_self?(association)
|
||||
parent_serializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship &&
|
||||
association.belongs_to? &&
|
||||
parent_serializer.object.respond_to?(association.reflection.foreign_key)
|
||||
end
|
||||
|
||||
@ -159,7 +159,14 @@ module ActiveModel
|
||||
end
|
||||
end
|
||||
|
||||
actual = serializable(post, adapter: :json_api, serializer: BelongsToBlogModelSerializer).as_json
|
||||
actual =
|
||||
begin
|
||||
original_option = BelongsToBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship
|
||||
BelongsToBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship = true
|
||||
serializable(post, adapter: :json_api, serializer: BelongsToBlogModelSerializer).as_json
|
||||
ensure
|
||||
BelongsToBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship = original_option
|
||||
end
|
||||
expected = { data: { id: '1', type: 'posts', relationships: { blog: { data: { id: '5', type: 'blogs' } } } } }
|
||||
|
||||
assert_equal expected, actual
|
||||
@ -189,7 +196,14 @@ module ActiveModel
|
||||
}
|
||||
post = BelongsToExternalBlogModel.new(attributes)
|
||||
|
||||
actual = serializable(post, adapter: :json_api, serializer: BelongsToExternalBlogModelSerializer).as_json
|
||||
actual =
|
||||
begin
|
||||
original_option = BelongsToExternalBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship
|
||||
BelongsToExternalBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship = true
|
||||
serializable(post, adapter: :json_api, serializer: BelongsToExternalBlogModelSerializer).as_json
|
||||
ensure
|
||||
BelongsToExternalBlogModelSerializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship = original_option
|
||||
end
|
||||
expected = { data: { id: '1', type: 'posts', relationships: { :'external-blog' => { data: { id: '6', type: 'external-blogs' } } } } }
|
||||
|
||||
assert_equal expected, actual
|
||||
|
||||
Loading…
Reference in New Issue
Block a user