6916


Ruby on
Railsの`ActiveRecord::Migration`クラスを継承したクラスでは`create_table`メソッドを呼ぶことができます。

この`create_table`メソッドの本体は`ActiveRecord::ConnectionAdapters::SchemaStatements`にある`create_table`メソッドのようだ、ということはソースを読んで予想できました。

しかし、`Migration`クラスで`SchemaStatements`モジュールをincludeしているようでもないのに、なぜ`create_table`メソッドが呼べるのか、という仕組みがわかりません。

なぜ呼べるのか教えてください。


CC BY-SA 3.0
2015-02-22T07:01:15.937
6910
2015-02-22T08:40:34.483
2015-02-22T07:32:42.127
85
2491
question
rails-activerecord
ActiveRecord::Migrationを継承したクラスでcreate_tableが呼べる仕組みを教えてください


簡単に答えが見つかるかと思いましたが、意外と難しいですね。

調べてみたところ、こちらのブログにほぼ答えが載っていました。

<http://d.hatena.ne.jp/elm200/20061001/1159806806>

簡単に言うと、 `ActiveRecord#method_missing` にて
`ActiveRecord::ConnectionAdapters::AbstractAdapter`
へ処理を委譲しているから`create_table`が呼べる、ということになります。

ただし、情報がちょっと古いのでRails 4.2.0のコードで確認してみました。

`method_missing`が処理を委譲しているコードはこちらになります。

![画像の説明をここに入力](https://i.stack.imgur.com/14pVl.png)

また、 `connection` の中身である `ActiveRecord::ConnectionAdapters::SQLite3Adapter`
クラスはちゃんと `ActiveRecord::ConnectionAdapters::SchemaStatements`
をincludeしているようです。（もちろん、 `SQLite3Adapter` 以外の場合も同様です）

![画像の説明をここに入力](https://i.stack.imgur.com/WYlc5.png)

これでスッキリ解決！！かな？  
いかがでしょうか？


CC BY-SA 3.0
2015-02-22T08:40:34.483
6916
2015-02-22T08:40:34.483
85
6910
answer