Skip to content

Methods defined on PrivateRelation should return T.self_type #2124

Open
@rzane

Description

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.

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions