Как Rails отслеживает, какие миграции выполнялись для базы данных?

В соответствии с Rails doc: http://guides.rubyonrails.org/migrations.html

"Active Record отслеживает, какие миграции уже запущены, поэтому вам нужно обновить исходный код и запустить rake db: migrate."

Как это делает ActiveRecord? Где Active Record хранит данные?

Я подозреваю, что это может быть сохранено в самой базе данных? В таблице где-то.

На моей машине разработки я выполнил все миграции. Затем я скопировал производственную базу данных с помощью mysqldump. Затем я запускал "rake db: migrate: status", он корректно показывает миграции, которые должны выполняться в производственной базе данных.

Раньше я думал, что ActiveRecord отслеживает последний прогон миграции с использованием метки времени. Но я думаю, что это не так, потому что ActiveRecord правильно запускает "старые" миграции, объединенные из другой ветки кода.

Может ли кто-нибудь с внутренним знанием этого разработать? Благодаря

Ответ 1

Rails создает таблицу в вашей базе данных под названием schema_migrations, чтобы отслеживать, какие миграции выполнялись.

В таблице содержится один столбец version. Когда Rails запускает миграцию, она берет ведущие цифры в имени файла миграции и вставляет строку для этой "версии", указывая, что она была запущена. Если вы откатите эту миграцию, Rails удалит соответствующую строку из schema_migrations.

Например, запуск файла миграции с именем 20120620193144_create_users.rb будет вставлять новую строку с версией 20120620193144 в таблицу schema_migrations.

Вы можете в любой момент ввести миграции с более ранними версиями. Rails всегда будет запускать любые новые миграции, для которых в schema_migrations нет соответствующей строки. Ведущие цифры не должны быть меткой времени, вы можете назвать свою миграцию 001_blah.rb. Ранние версии Rails использовали этот формат и использовали последовательную нумерацию для вновь созданных миграций. Более поздние версии переключились на временные метки, чтобы помочь нескольким разработчикам самостоятельно генерировать миграции с тем же номером.