Linked data with polymorphism does not work with custom `key_type`
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 52/100
Research direction
Start at lib/jsonapi/resource_serializer.rb:464 and inspect foreign_key_value, focusing on how polymorphic relationships obtain their ids when a custom key_type is configured. Reproduce the reported case and add coverage showing that the serialized relationship id respects the custom key_type rather than always using the direct association id.
Written by the indexing model from the issue text.
Description
This issue is a (choose one):
- Problem/bug report.
- Feature request.
- Request for support. Note: Please try to avoid submitting issues for support requests. Use Gitter instead.
Checklist before submitting:
- I've searched for an existing issue.
- I've asked my question on Gitter and have not received a satisfactory answer.
- I've included a complete bug report template. This step helps us and allows us to see the bug without trying to reproduce the problem from your description. It helps you because you will frequently detect if it's a problem specific to your project.
- The feature I'm asking for is compliant with the JSON:API spec.
Description
If you create a polymorphic association with custom key_type id is always taken which leads to a wrong data sharing.
Bug reports:
Everything is on lib/jsonapi/resource_serializer.rb:464
When calling source.public_send("#{relationship.name}_id"), it is fine (faster) but it does not take care about custom key_type.
But if you call source.public_send(relationship.name).try(:id), you're using the custom key_type.
Features:
We can set another argument to has_one to be able to mention that the key_type has been modified.
Here is my proposition:
# app/resources/my_awesome_resource
has_one :positionable, polymorphic: true, foreign_key: :positionable_id, foreign_key_type_changed: true
# jsonapi/resource_serializer.rb
def foreign_key_value(source, relationship)
# If you have changed the key_name, don't even try to look at `"#{relationship.name}_id"`
# just load the association and call the custom key_name
foreign_key_type_changed = relationship.options[:foreign_key_type_changed] || false
related_resource_id =
if source.preloaded_fragments.has_key?(format_key(relationship.name))
source.preloaded_fragments[format_key(relationship.name)].values.first.try(:id)
elsif !foreign_key_type_changed && source.respond_to?("#{relationship.name}_id")
# If you have direct access to the underlying id, you don't have to load the relationship
# which can save quite a lot of time when loading a lot of data.
# This does not apply to e.g. has_one :through relationships.
source.public_send("#{relationship.name}_id")
else
source.public_send(relationship.name).try(:id)
end
return nil unless related_resource_id
@id_formatter.format(related_resource_id)
end
- Dominant language
- Ruby
- Stars
- 2.3k
- Forks
- 546
- PR merge metrics
- No merged PRs in 30d
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from JSONAPI-Resources/jsonapi-resources
-
Difficulty 1/5 Under an hour Newbie friendliness 85/100
-
Difficulty 3/5 1-2 days Newbie friendliness 50/100
JSONAPI-Resources/jsonapi-resources#1488 · 1 comment ·
-
Difficulty 4/5 3-5 days Newbie friendliness 42/100
JSONAPI-Resources/jsonapi-resources#1479 · 2 comments ·
-
Difficulty 4/5 3-5 days Newbie friendliness 30/100
JSONAPI-Resources/jsonapi-resources#1477 · 3 comments · 1 reaction ·
-
Difficulty 3/5 1-2 days Newbie friendliness 45/100
All issues in JSONAPI-Resources/jsonapi-resources
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
-
ai-generated
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
hanami/hanami-cli#449 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
hanami/hanami-router#310 ·