I enjoy using Rails, but sometimes it's a pain in the ass, and usually because it tries to be too clever to reduce the amount of boiler platey code you need to write. In terms of code management, I'd much rather have explicit dependencies. Less `belongs_to :thing`, and more `belongs_to :thing, foreign_key: 'thing_id', klass: Thing`. Makes refactoring and code navigation so much easier.
Also, pre-Rails 5, the defaults for DB migrations and relations were trash.
Things auto running and importing themselves seems magical because no other mainstream language does that
Doesn't Rail's use of metaprogramming mean that often there isn't a simple static implementation of a method in the source code that you can go and find?
And while you can't find the method code itself, for example the generated code to access a has_many relationship, you can pretty easily find the meta programming that will generate it by following the class method name.
I've wrote a bit on this on my blog in the context of creating a (nano) web framework similar to Rails [1] and a (nano) http client library similar to requests [2].
I find this to help assure me that if I have to go one layer deep in abstraction I'd still be able to learn how it works.
[1] https://mhasbini.com/blog/lets-build-a-web-framework.html
[2] https://mhasbini.com/blog/lets-build-an-http-client.html