質問: Ruby on Railsの`ActiveRecord::Migration`クラスを継承したクラスでは`create_table`メソッドを呼ぶことができます。 この`create_table`メソッドの本体は`ActiveRecord::ConnectionAdapters::SchemaStatements`にある`create_table`メソッドのようだ、ということはソースを読んで予想できました。 しかし、`Migration`クラスで`SchemaStatements`モジュールをincludeしているようでもないのに、なぜ`create_table`メソッドが呼べるのか、という仕組みがわかりません。 なぜ呼べるのか教えてください。
回答: 簡単に答えが見つかるかと思いましたが、意外と難しいですね。 調べてみたところ、こちらのブログにほぼ答えが載っていました。 簡単に言うと、 `ActiveRecord#method_missing` にて `ActiveRecord::ConnectionAdapters::AbstractAdapter` へ処理を委譲しているから`create_table`が呼べる、ということになります。 ただし、情報がちょっと古いのでRails 4.2.0のコードで確認してみました。 `method_missing`が処理を委譲しているコードはこちらになります。 !画像の説明をここに入力 また、 `connection` の中身である `ActiveRecord::ConnectionAdapters::SQLite3Adapter` クラスはちゃんと `ActiveRecord::ConnectionAdapters::SchemaStatements` をincludeしているようです。(もちろん、 `SQLite3Adapter` 以外の場合も同様です) !画像の説明をここに入力 これでスッキリ解決!!かな? いかがでしょうか?