Rails の内部構造


28日に、「はじめよう Ruby on Rails」はとてもよい本ではあるが、どうにもわからない部分がある、と書いた。もういちど読み直したのだが、62ページのこの部分でどうにも先に進まなくなってしまった。

db/migrate/001_create_schedule.rb (修正後)


class CreateSchedules < ActiveRecord::Migration
def self.up
create_table(:schedules) do |t|
t.column(:datatime, :timestamp)
t.column(:title, :string)
t.column(:content, :text)
end
end

def self.down
drop_table(:schedules)
end
end


これを見ると次のような疑問がフツフツを浮かびあがってきたのである。
「ここに出てくる create_table って何よ?」
「|t| で渡される t って何?」
「そもそもどういう仕掛けで、up() や down() が呼び出されるの?」
そこで、禁断の道に入ることにした・・・。すなわち、Railsソースコードを読み込むのである。

(以下、ちょっとマニアックなので、興味のない方は読まないほうがいいかもしれない)


たとえば、create_table() については、
http://rubyonrails.org/api/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html
を見ると、これは
vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
というファイルで定義されているらしいということがわかる。
私の環境では、これは、
C:\ruby\lib\ruby\gems\1.8\gems\activerecord-1.14.4\lib\active_record\connection_adapters\abstract\schema_statements.rb
であった。


しかし、この create_table()、じつは ActiveRecord::ConnectionAdapters::SchemaStatements という
モジュールに属するメソッドで、決して ActiveRecord::Migration のメソッドではないのである。
そこで、create_table() がどうして ActiveRecord::Migration で使えるのか、探求する旅が
始まった・・・(続く)