DirtyModel uses a hash to keep track of any changes made to attributes
of an instance. When using the attribute_will_change! method, you must
supply a string and not a symbol or the *_changed? method will break
(because it is looking for the attribute name as a string in the keys
of the underlying hash). To remedy this, I simply made the underlying
hash a HashWithIndifferentAccess so it won't matter if you supply
the attribute name as a symbol or string to attribute_will_change!.
Merge pull request #8791 from griffinmyers/master

Updated DirtyModel's @changed_attributes hash to be symbol/string agnostic

Conflicts:
	activemodel/CHANGELOG.md
map the association chain to table names
Port test from cf1904f to avoid future regression

Related issue: #11939, #12084
Merge pull request #12435 from sikachu/master-port-12084

Port test from cf1904f to avoid future regression
require the files we need so the classes are stand-alone
parent is always passed in, so make it non-optional
simplify the JoinAssociation constructor, check validity *before*
Set the join type on construction

We always set the join type immediately after construction, just make it
part of the constructor and we can skip that step
Always pass parameters to `build`

We always know the parameters in advance, so we don't need to build it
in to the method signature
hashes are ordered, so we do not need to sort
inject down the hash cache