2011-11-23 16 views
7

私はRubyとRailsを本当に使い始めました。自分が本当に楽しんでいることの1つは、使用する規則です。rake db :: migrateは実際にどのように動作しますか

自分のRuby以外のプロジェクトでその動作を模倣したいと思います。

私の質問は実際にどのように機能するのですか?私はRailsのコードを見ることができることは知っていますが、私はそれで何が起こっているのかを理解するのに十分遠いわけではありません。

私はそれがベースラインスクリプトを受け取り、それに対してスキーマ変更の更新を実行することを知っています。しかし、それはどのバージョンのものかをどのように知っていますか?私は他のフレームワーク/データベースでそれをどのように模倣しますか?

+1

最終移行の内容を確認します。それはそれの後に来るものを実行します。 *非常に*広く、それはSQLを書くためのDSL(3.1の可逆SQL)です。あなたはもっと具体的になりますか? –

+0

それは多くの方法で動作します...それのどのような特定の側面があなたを避けていますか? –

+0

質問が更新されました。私は移住とティアダウンについて具体的に話しています(つまり、rake migrate rollback)。 – Dan

答えて

21

注:これは、Rails 2.xの場合に限ります。私が好きだったようにRails 3に多くの時間を費やしていないので、それはレール3にとって真実ではないかもしれません。

レールはschema_migrationsという特別な隠しテーブルを作成します。このテーブルには、versionという1つの列があります。そして、あなたが持っているすべての移行のためにこの列に行があります。値は、移行ファイル名のタイムスタンプと一致するタイムスタンプです。

移行すると、すべての移行が時系列順に表示されます(また、タイムスタンプベースの命名規則のためアルファベット順になります)。移行のたびに、schema_migrationsテーブル内の一致する行が検索されます。見つからない場合は、その移行を実行し、テーブルのタイムスタンプを追加します。見つけた場合は、すでに実行されているとみなし、単純にスキップします。

結果として、2人の開発者が任意の順序で移行をコミットすることができ、うまくいきます。これは、データベースが最初にそれらを見たときに関係なく、Railsは実行された移行と移行されていない移行を正確に把握しているからです。

このように自分で何かをするには、どのような措置が取られていないかについて、この状態を永久に保存する必要があります。

+0

これはまさに私が探していたものです。本当にありがとう。 – Dan

+0

このコンテキストでschema.rbの関連性は何ですか?すべての移行をデータベース列に一致させると、schema.rbは使用できません。 –

+0

これはPhotoshopファイルのようなものです。移行はレイヤーであり、schema.rbは結合されたすべてのレイヤーの最終的な平坦化結果です。したがって、テスト・データベースにスキーマをロードするだけであれば、同じ結果を得るために何百もの移行を順番に実行するのではなく、すばやく実行できます。 –

関連する問題