[解決済み] Rails は、データベースに対して実行されたマイグレーションをどのように追跡しているのですか?
質問
Railsのドキュメントによると http://guides.rubyonrails.org/migrations.html
"アクティブレコードはどのマイグレーションが既に実行されたかを追跡するので、ソースを更新して rake db:migrate." を実行するだけでよいのです。
ActiveRecordは実際にどのようにこれを行うのでしょうか? Active Recordはデータをどこに保存するのですか?
データベース自体に保存されているのではないでしょうか? どこかのテーブルに。
私の開発マシン上で、私はすべての移行を実行しました。 それから、mysqldump を使用して本番データベースをコピーしました。 それから "rake db:migrate:status" を実行すると、本番データベースで実行する必要のある移行が正しく表示されました。
私は、ActiveRecord がタイムスタンプを使用して最後に実行されたマイグレーションを追跡していると考えていました。 しかし、ActiveRecord は別のコード ブランチからマージされた "古い"マイグレーションを正しく実行するので、これは真実ではないと思われます。
このことについて内部知識をお持ちのどなたか、詳しく説明していただけませんか? ありがとうございます。
どのように解決するのですか?
Railsは、データベース内に
schema_migrations
というテーブルを作成し、どのマイグレーションが実行されたかを記録します。
このテーブルには1つのカラムがあります。
version
. Railsがマイグレーションを実行すると、マイグレーションのファイル名の先頭の数字を取り、その"version"の行を挿入し、それが実行されたことを表します。そのマイグレーションをロールバックすると、Railsは対応する行を
schema_migrations
.
例えば、マイグレーションファイルの名前を
20120620193144_create_users.rb
という名前のマイグレーションファイルを実行すると、新しい行が挿入され、そのバージョンは
20120620193144
の中に
schema_migrations
テーブルの中に入れます。
以前のバージョンを使ったマイグレーションを導入することはいつでも自由です。に対応する行がない場合、Railsは常に新しいmigrationsを実行します。
schema_migrations
. 先頭の数字はタイムスタンプである必要はないので、マイグレーションを
001_blah.rb
. Railsの初期のバージョンではこの形式を使用し、新しく生成されたマイグレーションに連番を使用していました。後のバージョンでは、複数の開発者が同じ番号のマイグレーションを独立して生成するのを防ぐために、タイムスタンプに変更されました。
関連
-
[解決済み】なぜRuby on Railsは、http://localhost:3000 の代わりに http://0.0.0.0:3000 を使用するのですか?
-
[解決済み】Rails: sudo "コマンドが認識されないのはなぜですか?
-
[解決済み】Bundler: コマンドが見つからない
-
[解決済み】コントローラでJSONをレンダリングする
-
[解決済み】Rails 4 RoutingError: ルートが一致しない[POST]。
-
[解決済み] Ruby on Railsのランナー
-
[解決済み] RailsのRootディレクトリのパス?
-
[解決済み] Railsはsaveでモデル内の検証をスキップしますか?
-
[解決済み] Rspec が私のモデルクラスを認識しない。初期化されていない定数エラー
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コレクションをDESCで並べる方法
-
[解決済み】PG::ConnectionBad: fe_sendauth: パスワードが供給されない
-
[解決済み] Railsです。NameError: 初期化されていない定数
-
[解決済み] rake db:migrateを使って1ステップだけロールバックする方法
-
[解決済み] Railsでpng画像を文字列形式で表示するには?
-
[解決済み] Railsで `before_action` での `only:` はどのように機能するのですか?
-
[解決済み] railsアプリケーションでCookieのオーバーフロー?
-
[解決済み] rspecにおけるassignsの意味
-
[解決済み] Rspec が私のモデルクラスを認識しない。初期化されていない定数エラー
-
[解決済み] ActionController::RoutingError: 初期化されていない定数MicropostsController