Methods defined on `PrivateRelation` should return `T.self_type`
Opened this issue · 0 comments
rzane commented
I wrote a compiler for Kaminari that returns the following:
sig { T.all(PrivateRelation, Kaminari::PageScopeMethods, Kaminari::ActiveRecordRelationMethods) }
def page(num = nil); end
This type is accurate, since .page
uses .extending
to add methods to the relation.
This works:
User.page(5).total_count
This doesn't work:
User.page(5).all.total_count
^^^^^^^^^^^ Method `total_count` does not exist on `User::PrivateRelation`
That's because the return type of for .all
is PrivateRelation
. We could fix this problem by using T.self_type
instead, which I believe more accurately captures the way ActiveRecord works.
The way that relevant compilers are currently implemented makes this a little tricky, since the methods that are being added to the PrivateRelation
are also added to the model. The methods defined on the model should be PrivateRelation
.