Railsはデータベースに対して実行されたマイグレーションをどのように追跡しますか?


93

Rails docによると:http : //guides.rubyonrails.org/migrations.html

「アクティブレコードは、どのマイグレーションがすでに実行されているかを追跡するため、ソースを更新してrake db:migrateを実行するだけです。」

ActiveRecordは実際にどのようにこれを行いますか?Active Recordはどこにデータを保存しますか?

これはデータベース自体に格納されているのではないでしょうか?どこかのテーブルに。

私の開発マシンでは、すべての移行を実行しました。次に、mysqldumpを使用して本番データベースをコピーしました。次に、「rake db:migrate:status」を実行したところ、本番データベースで実行する必要がある移行が正しく表示されます。

私は以前、ActiveRecordがタイムスタンプを使用して最後の移行実行を追跡していると思っていました。しかし、ActiveRecordは別のコードブランチからマージされた「古い」移行を正しく実行するため、これは正しくないと思います。

この手の込んだ知識を持つ誰かができますか?ありがとう


1
追跡するデータベースのテーブルがあると思います。
ジャックフランクリン

回答:


166

Railsは、schema_migrationsどのマイグレーションが実行されたかを追跡するために呼び出されるデータベースにテーブルを作成します。

テーブルには単一の列が含まれていますversion。Railsがマイグレーションを実行するとき、マイグレーションのファイル名の先頭の数字を取り、その「バージョン」の行を挿入して、実行されたことを示します。その移行をロールバックすると、Railsは対応する行をから削除しschema_migrationsます。

たとえば、という名前の移行ファイルを実行する20120620193144_create_users.rbと、バージョンがの新しい行20120620193144schema_migrationsテーブルに挿入されます。

以前のバージョンでの移行をいつでも導入できます。Railsは常に、に対応する行がない新しいマイグレーションを実行しschema_migrationsます。先頭の数字はタイムスタンプである必要はありません001_blah.rb。移行と呼ぶことができます。Railsの以前のバージョンではこの形式を使用し、新しく生成された移行には連番を使用していました。以降のバージョンでは、複数の開発者が同じ番号のマイグレーションを個別に生成できないように、タイムスタンプに切り替えています。


マウント可能なエンジンとダミーアプリを組み合わせて使用​​している場合に特に便利です
Donato
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.