Redefine macro checks for reflections

Now that we define the macro on the reflection type we no longer
need to check `macro == :what` on each type for `belongs_to?` or
`has_one?` etc. These now default to false unless it's defined
in the reflection class.

Reuse existing belongs_to? method to check macros

We don't need to do `:belongs_to == macro` anymore becasue we
have a `belongs_to?` method. I didn't find this being used
anywhere for `has_one?` or `collection?` since they were already
fixed.
Merge pull request #16351 from eileencodes/finish-refactoring-macro-to-eliminate-checking-against-symbols

Redefine macro checks for reflections
Refactor join_keys to remove complex conditionals

Pushing conditionals down to through reflection

Only the through association needs the part of this conditional
that deals with belongs to and polymorphic? so that can be pushed
down into the ThroughReflection reducing the conditionals.

Remove conditional because we can delegate join keys to source reflection

Remove need for source_macro checking

By adding join_id_for to the other reflections we remove the need
to cehck against the source_macro and can reduce the conditioanl
from the original join_id_for(owner)

Using polymorphism instead of testing the source_macro

This case statement in join_association is almost exactly the same
as the original join_keys code. Testing taht theory by creating a
new join_dependency_keys(assoc_klass) method.

Refactor join_keys further to be more concise

Fixed format of "#:nodoc:" to "# :nodoc:" where I added them to this
file.
Push options check up so we can simplify internal methods
Simplify conditional
Rename variable to better show its intent
Only concatenate path if it was given rather than converting blindly
Do not reassign variable when mutation is happening

These methods mutate the path variable/argument so there is no need
to reassign it every time.
Realign assignments :scissors:
Merge pull request #16353 from eileencodes/refactor-join_keys-usage-in-reflection

Refactor join_keys to remove complex conditionals
Add ActiveRecord::Tasks::DatabaseTasks.migrate

This extracts the logic that was embedded in a Rake task into a static
method.
Bonus: the first test for `rake db:migrate`
Clarify how the ConnectionHandler works

This makes the implicit description of how connection pooling works a
little more explicit. It converts the examples of a model hierarchy into
actual Ruby code and demonstrates how the key structure of the
database.yml relates to the `establish_connection` method.
Merge pull request #16361 from JackDanger/clearer-connection-pool-documentation

[doc] Clarify how the ConnectionHandler works
Merge pull request #16350 from JackDanger/test-rake-db-migrate-task

Add ActiveRecord::Tasks::DatabaseTasks.migrate
do a hash lookup for collision detection

hash lookup should be faster than searching an array.
invert check so we fail faster

there's no reason to to_sym the string if it doesn't match the regexp
anyway
Remove being/number methods from transaction class
Remove parent on Transaction object
Make ClosedTransaction a null object
Merge pull request #16341 from arthurnn/transactions_remove_begin

Transactions refactoring - 2