Comments (6)
Hi Riley, like you said, sorbet
doesn't support having 2 sig for one method. The .select
method that returns an array is a select performed on the materialized element of an active record.
You can convert the relation to array then perform select for typechecking.
For example: User.all.to_a.select
<- This will take a block and returns an Array
Let me know if this is helpful.
from sorbet-rails.
Do you want to remove the block as a parameter then? Right now, the sig
produced implies that you can pass in a block and return an ActiveRecord_Relation
, which will not happen. It also implies you can pass both args
and a block, which will throw a runtime error.
from sorbet-rails.
from sorbet-rails.
Making the return type of select be T.any(User::ActiveRecord_Relation, T::Array[User]) is not great, because callers will always have to check which type is being returned, even though it can always be inferred from the argument type.
Yeah, this is a limitation of Sorbet. Unless they start supporting sig overloading (mutltiple sig
s per def
), this is impossible to express using the type system.
I agree that returning T.any(User::ActiveRecord_Relation, T::Array[User])
is a worse user experience.
My workaround is adding to_a
before any enumerable select
s, i.e. replacing this:
User.where(foo: 'bar').select(&:some_predicate)
...with this:
User.where(foo: 'bar').to_a.select(&:some_predicate)
π€·ββ
from sorbet-rails.
If the block
argument doesn't get removed, there's another issue there where args it yields are treated by sorbet as NilClass
. This is the sig that currently gets generated in the User::ActiveRecord_Associations_CollectionProxy
sig { params(args: T.untyped, block: T.nilable(T.proc.void)).returns(User::ActiveRecord_Relation) }
def select(*args, &block); end
foo.users.select {|u| T.reveal_type(u)} # Revealed type: NilClass
If the generated sig looked like this:
sig { params(args: T.untyped, block: T.proc.params(user: User).void).returns(User::ActiveRecord_Relation) }
def select(*args, &block); end
foo.users.select {|u| T.reveal_type(u)} # Revealed type: User
It would be handy. At the moment you have to either call to_a
as @pje said. This is separate from the issue of the return type, which I don't have a strong opinion on yet.
from sorbet-rails.
from sorbet-rails.
Related Issues (20)
- Feature: Re-generate model RBIs on db:migrate HOT 2
- Feature: custom methods on associations.
- Signatures not generated for models using new ActiveRecord::DelegatedType
- Has_many with scope on association HOT 2
- Decide whether to drop Ruby 2.4 and Ruby 2.5 HOT 2
- Feature Request: --verify option for CI HOT 1
- FR: helper_generator_class
- Method object does not exist on ActionView::Helpers::FormBuilder HOT 1
- Don't know how to build task 'rails_rbi:routes' HOT 1
- Unable to resolve constant BatchEnumerator HOT 1
- Enum override in ActiveRecordOverrides breaks with Rails 7 HOT 5
- Lots of T.nilable(T.untyped) errors after sorbet 0.5.9556
- Classic Loader issues with srb init HOT 1
- warning: already initialized constant RAILS_RBI_RAKE_DIR
- regression on update to sorbet 0.5.9892+ HOT 1
- `rails_rbi:jobs` raise unknown prefix error HOT 2
- Model with `enum` raises `ArgumentError: wrong number of arguments (given 3, expected 1)`
- Type check errors in generated RBI files HOT 2
- Readme typo custom -> controllers ?
- `pluck_to_tstruct` assigns plucked values to the wrong tstruct keys depending on the order in which the tstruct props for associations are listed
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
π Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. πππ
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google β€οΈ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from sorbet-rails.