Согласно документу Rails: http://guides.rubyonrails.org/migrations.html
«Active Record отслеживает, какие миграции уже были выполнены, поэтому все, что вам нужно сделать, это обновить исходный код и запустить rake db: migrate».
Как ActiveRecord на самом деле это делает? Где Active Record хранит данные?
Я подозреваю, что это может храниться в самой базе данных? Где-то в таблице.
На своей машине разработки я выполнил все миграции. Затем я скопировал производственную базу данных с помощью mysqldump. Затем я запустил rake db: migrate: status, он правильно показывает миграции, которые необходимо выполнить в производственной базе данных.
Раньше я думал, что ActiveRecord отслеживает последний запуск миграции, используя временную метку. Но я думаю, что это не так, потому что ActiveRecord правильно выполняет «старые» миграции, объединенные из другой ветки кода.
Может ли кто-нибудь изнутри разбираться в этом подробнее? Благодарность
источник
Ответы:
Rails создает в вашей базе данных таблицу, вызываемую
schema_migrations
для отслеживания выполненных миграций.Таблица состоит из одного столбца
version
. Когда Rails запускает миграцию, он берет первые цифры в имени файла миграции и вставляет строку для этой «версии», указывающую, что она была запущена. Если вы откатите эту миграцию, Rails удалит соответствующую строку изschema_migrations
.Например, запуск файла миграции с именем
20120620193144_create_users.rb
вставит новую строку с версией20120620193144
вschema_migrations
таблицу.Вы можете в любой момент осуществить миграцию с более ранними версиями. Rails всегда будет запускать любые новые миграции, для которых нет соответствующей строки
schema_migrations
. Первые цифры не обязательно должны быть меткой времени, вы можете назвать миграцию001_blah.rb
. Более ранние версии Rails использовали этот формат и использовали последовательную нумерацию для вновь созданных миграций. В более поздних версиях используются метки времени, чтобы несколько разработчиков не могли независимо генерировать миграции с одним и тем же номером.источник