Make ActiveRecord#find return value typed #1089
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation
Currently the return value of e.g.
Post#find
gets generated as untyped. We could catch some subtle bugs if it was typed.Imagine a novice Rails dev who's not familiar with which finder method would return
nil
and which would raise exception if no record was found. Sorbet could warn e.g. if we tried tonil
check on the return value of afind
.Implementation
I first thought that
find
always returns with a model, but it turned out it can be used to query multiple record at once so I went with a union type: either the model or an array of the models is returned.(Some more background:
rails-sorbet
chose to support only the one model retrieval forfind
and introduced a new method for the multiple record use case.)Tests
I've modified the existing test for the generated signature for
#find
.