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

94

Согласно документу Rails: http://guides.rubyonrails.org/migrations.html

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

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

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

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

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

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

Зак Сюй
источник
1
Я считаю, что у него есть таблица в базе данных, которая отслеживает.
Джек Франклин,

Ответы:

167

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

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

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

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

Meagar
источник
Особенно полезно, когда вы используете смесь устанавливаемого движка и фиктивного приложения
Донато