Skip to content

Instantly share code, notes, and snippets.

@castwide
Last active April 27, 2024 08:54
Show Gist options
  • Save castwide/28b349566a223dfb439a337aea29713e to your computer and use it in GitHub Desktop.
Save castwide/28b349566a223dfb439a337aea29713e to your computer and use it in GitHub Desktop.
Enhance Rails Intellisense in Solargraph
# The following comments fill some of the gaps in Solargraph's understanding of
# Rails apps. Since they're all in YARD, they get mapped in Solargraph but
# ignored at runtime.
#
# You can put this file anywhere in the project, as long as it gets included in
# the workspace maps. It's recommended that you keep it in a standalone file
# instead of pasting it into an existing one.
#
# @!parse
# class ActionController::Base
# include ActionController::MimeResponds
# extend ActiveSupport::Callbacks::ClassMethods
# extend AbstractController::Callbacks::ClassMethods
# end
# class ActiveRecord::Base
# extend ActiveRecord::QueryMethods
# extend ActiveRecord::FinderMethods
# extend ActiveRecord::Associations::ClassMethods
# extend ActiveRecord::Inheritance::ClassMethods
# include ActiveRecord::Persistence
# end
# @!override ActiveRecord::FinderMethods#find
# @overload find(id)
# @param id [Integer]
# @return [self]
# @overload find(list)
# @param list [Array]
# @return [Array<self>]
# @overload find(*args)
# @return [Array<self>]
# @return [self, Array<self>]
@sam-6174
Copy link

You can put this file anywhere in the project, as long as it gets included in the workspace maps

I'm not sure how to tell / make sure that the file is included in the workspace maps. Can anyone give an example implementation?

See The Comment File section at https://solargraph.org/guides/rails

@chunleng
Copy link

Regardless of whether it's right or wrong, I feel that having more modules in the ActiveRecord can really help a lot in the development experience, and thus, I add the following:

extend all modules under Active Record
#   class ActiveRecord::Base
#     extend ActiveRecord::Aggregations
#     extend ActiveRecord::Aggregations::ClassMethods
#     extend ActiveRecord::Batches
#     extend ActiveRecord::Calculations
#     extend ActiveRecord::Callbacks
#     extend ActiveRecord::Coders
#     extend ActiveRecord::ConnectionAdapters
#     extend ActiveRecord::ConnectionAdapters::AbstractPool
#     extend ActiveRecord::ConnectionAdapters::ColumnMethods
#     extend ActiveRecord::ConnectionAdapters::DatabaseLimits
#     extend ActiveRecord::ConnectionAdapters::DatabaseStatements
#     extend ActiveRecord::ConnectionAdapters::DetermineIfPreparableVisitor
#     extend ActiveRecord::ConnectionAdapters::MySQL
#     extend ActiveRecord::ConnectionAdapters::MySQL::ColumnMethods
#     extend ActiveRecord::ConnectionAdapters::MySQL::DatabaseStatements
#     extend ActiveRecord::ConnectionAdapters::MySQL::Quoting
#     extend ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::ColumnMethods
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::OID
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::ReferentialIntegrity
#     extend ActiveRecord::ConnectionAdapters::PostgreSQL::Utils
#     extend ActiveRecord::ConnectionAdapters::QueryCache
#     extend ActiveRecord::ConnectionAdapters::QueryCache::ConnectionPoolConfiguration
#     extend ActiveRecord::ConnectionAdapters::Quoting
#     extend ActiveRecord::ConnectionAdapters::Savepoints
#     extend ActiveRecord::ConnectionAdapters::SQLite3
#     extend ActiveRecord::ConnectionAdapters::SQLite3::DatabaseStatements
#     extend ActiveRecord::ConnectionAdapters::SQLite3::Quoting
#     extend ActiveRecord::ConnectionAdapters::SQLite3::SchemaStatements
#     extend ActiveRecord::ConnectionAdapters::SchemaStatements
#     extend ActiveRecord::ConnectionHandling
#     extend ActiveRecord::Core
#     extend ActiveRecord::Core::ClassMethods
#     extend ActiveRecord::CounterCache
#     extend ActiveRecord::CounterCache::ClassMethods
#     extend ActiveRecord::DefineCallbacks
#     extend ActiveRecord::DefineCallbacks::ClassMethods
#     extend ActiveRecord::Delegation::ClassMethods
#     extend ActiveRecord::Delegation::ClassSpecificRelation
#     extend ActiveRecord::Delegation::ClassSpecificRelation::ClassMethods
#     extend ActiveRecord::Delegation::DelegateCache
#     extend ActiveRecord::DynamicMatchers
#     extend ActiveRecord::Enum
#     extend ActiveRecord::Explain
#     extend ActiveRecord::FinderMethods
#     extend ActiveRecord::Generators
#     extend ActiveRecord::Generators::Migration
#     extend ActiveRecord::Generators::Migration::ClassMethods
#     extend ActiveRecord::Inheritance
#     extend ActiveRecord::Inheritance::ClassMethods
#     extend ActiveRecord::Integration
#     extend ActiveRecord::Integration::ClassMethods
#     extend ActiveRecord::LegacyYamlAdapter
#     extend ActiveRecord::LegacyYamlAdapter::Rails41
#     extend ActiveRecord::LegacyYamlAdapter::Rails420::
#     extend ActiveRecord::Locking
#     extend ActiveRecord::Locking::Optimistic
#     extend ActiveRecord::Locking::Optimistic::ClassMethods
#     extend ActiveRecord::Locking::Pessimistic
#     extend ActiveRecord::Middleware
#     extend ActiveRecord::ModelSchema
#     extend ActiveRecord::ModelSchema::ClassMethods
#     extend ActiveRecord::NestedAttributes
#     extend ActiveRecord::NoTouching
#     extend ActiveRecord::NoTouching::ClassMethods
#     extend ActiveRecord::NullRelation
#     extend ActiveRecord::Persistence
#     extend ActiveRecord::Persistence::ClassMethods
#     extend ActiveRecord::Querying
#     extend ActiveRecord::QueryMethods
#     extend ActiveRecord::Railties
#     extend ActiveRecord::Railties::CollectionCacheAssociationLoading
#     extend ActiveRecord::Railties::ControllerRuntime
#     extend ActiveRecord::Railties::ControllerRuntime::ClassMethods
#     extend ActiveRecord::ReadonlyAttributes
#     extend ActiveRecord::ReadonlyAttributes::ClassMethods
#     extend ActiveRecord::Reflection
#     extend ActiveRecord::Reflection::ClassMethods
#     extend ActiveRecord::Sanitization
#     extend ActiveRecord::Sanitization::ClassMethods
#     extend ActiveRecord::Scoping::ClassMethods
#     extend ActiveRecord::Scoping::Default
#     extend ActiveRecord::Scoping::Default::ClassMethods
#     extend ActiveRecord::Scoping::Named
#     extend ActiveRecord::Scoping::Named::ClassMethods
#     extend ActiveRecord::SecureToken
#     extend ActiveRecord::SecureToken::ClassMethods
#     extend ActiveRecord::Serialization
#     extend ActiveRecord::SpawnMethods
#     extend ActiveRecord::Store
#     extend ActiveRecord::Store::ClassMethods
#     extend ActiveRecord::Suppressor
#     extend ActiveRecord::Suppressor::ClassMethods
#     extend ActiveRecord::Tasks
#     extend ActiveRecord::Tasks::DatabaseTasks
#     extend ActiveRecord::TestDatabases
#     extend ActiveRecord::TestFixtures
#     extend ActiveRecord::TestFixtures::ClassMethods
#     extend ActiveRecord::Timestamp
#     extend ActiveRecord::Timestamp::ClassMethods
#     extend ActiveRecord::TouchLater
#     extend ActiveRecord::Transactions
#     extend ActiveRecord::Transactions::ClassMethods
#     extend ActiveRecord::Translation
#     extend ActiveRecord::Type
#     extend ActiveRecord::Type::Internal
#     extend ActiveRecord::Type::Internal::Timezone
#     extend ActiveRecord::TypeCaster
#     extend ActiveRecord::Validations
#     extend ActiveRecord::Validations::Callbacks
#     extend ActiveRecord::Validations::ClassMethods
#     extend ActiveRecord::Validations::Clusivity
#     extend ActiveRecord::VERSION
#   end

And some other thought...

  • Since I have added by using solargraph to select the modules one by one, there should be a programmatic way to deal with the above.
  • The yard document seems to tell you whether the function returns a relation or not? (for example, .all function says "ActiveRecord::Scoping::Named::ClassMethods#all Returns an ActiveRecord::Relation scope object") maybe we can use that information to annotate the function?

Not sure whether it is possible or not, any thoughts?

@glaucocustodio
Copy link

glaucocustodio commented Oct 24, 2022

You might be interested on the solargraph-rails gem instead of relying on this ad-hoc config file

@pedz
Copy link

pedz commented Oct 24, 2022

You might be interested on the solargraph-rails gem instead of relying on this ad-hoc config file

There is no "Up vote" so... thanks!

@Samuelodan
Copy link

This doesn't appear to have made a difference for me. I'm just confused at this point.

@AndreiMotinga
Copy link

@Samuelodan I found answer in the entire rails thread castwide/solargraph#87

you might need to install docs. in my case what helped me was

gem install yard
yard docs
bundle add solargraph solargraph-rails
solargraph config

.solargraph.yml

---
include:
  - "**/*.rb"
exclude:
  - spec/**/*
  - test/**/*
  - vendor/**/*
  - ".bundle/**/*"
require:
  - actioncable
  - actionmailer
  - actionpack
  - actionview
  - activejob
  - activemodel
  - activerecord
  - activestorage
  - activesupport
domains: []
reporters:
  - rubocop
  - require_not_found
formatter:
  rubocop:
    cops: safe
    except: []
    only: []
    extra_args: []
require_paths: []
plugins:
  - solargraph-rails
max_files: 5000

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment