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に乗ってる。