ARを読んでみる2

接続するデータベースはMySQL

ActiveRecord::Base.connection

クラスメソッドconnectionが定義されてるのは
active_record/connection_adapters/abstract/connection_specification.rb

クラスメソッド:connection

if @active_connection_name && (conn = active_connections[@active_connection_name])
↑初回呼び出し時はどちらもnil
なのでretrieve_connectionを呼び出す。
retrieve_connectionから戻ってきたconnをクラス変数のハッシュactive_connectionsにセット。
connを返す。

クラスメソッド:retrieve_connection

retrieve・・・取り出す
コネクションを取り出す
retrieve_connectionが返すのがconn
conn不明
connはActiveRecord::ConnectionAdapters::MysqlAdapterクラスのオブジェクト。
1.クラスメソッドactive_connection_nameの戻り値("ActiveRecord::Base")をname(クラス名)にセット
2.クラス変数のハッシュactive_connectionsにキー"ActiveRecord::Base"がなかったら
  クラス変数のハッシュdefined_connectionsから値とりだす。
  初回呼び出し時、active_connectionsはnil。
  defined_connectionsはクラスメソッドestablish_connectionで設定したやつだ。たしか。
  値はActiveRecord::Base::ConnectionSpecificationクラスのオブジェクト。
  変数adapter_methodとconfig(establish_connectionに渡したハッシュ)が入っている。
3. name.constantize

ActiveSupportのメソッドconstantize
def constantize(camel_cased_word)
  raise NameError, "#{camel_cased_word.inspect} is not a valid constant name!" unless
     /^(::)?([A-Z]\w*)(::[A-Z]\w*)*$/ =~ camel_cased_word
  camel_cased_word = "::#{camel_cased_word}" unless $1
  Object.module_eval(camel_cased_word, __FILE__, __LINE__)
end


クラス名のチェックして、クラス名に"::"を頭につけた
::ActiveRecord::Baseのコンテキストに?
頭につけた"::"の意味は??
でも戻り値はActiveRecord::Baseクラスそのものになっている。

camel_cased_wordが"ActiveRecord::Base"のとき、ActiveRecord::Baseクラスを返す。

4.オーバーロードのクラスメソッドconnection
こいつにConnectionSpecificationクラスのオブジェクトを渡す。
adapter_methodをsend。configを渡す。
establish_connectionメソッドを呼ぶときに渡した:adapterの文字列に
"_connection"をつけたもの。mysql_connectionとか。
mysql_connectionはactive_record/connection_adapters/mysql_adapeter.rbで定義されてる。

わかったこと

ActiveRecord::Base.establish_connectionでつくるのは
ActiveRecord::Base::ConnectionSpecificationオブジェクト。
データベースへの接続情報。
ActiveRecord::Baseクラスが保持。


ActiveRecord::Base.connectionでつくるのは
各データベースのコネクションオブジェクトを持つAdapterオブジェクト。
ActiveRecord::Baseクラスが保持。


abstructってディレクトリがあるけど、Abstructクラスとそれを継承するConcreteクラスがあるわけじゃない。
継承するのではなくて、ConcreteクラスがAbstructクラスをrequireしている。
結局全部がActiveRecord::Baseに乗ってる。