105

Railsのドキュメントによると:http://guides.rubyonrails.org/migrations.html

「ActiveRecordはどの移行がすでに実行されているかを追跡するので、ソースを更新してrake db:migrateを実行するだけです。」

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

これはデータベース自体に保存されているのではないかと思いますか?どこかのテーブルで。

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

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

これについての内部知識を持っている人は、手の込んだものでしょうか?ありがとう

4

1 に答える 1

183

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

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

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

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

于 2012-08-21T14:45:49.067 に答える