Примечание. Это верно для Rails 2.x. Возможно, это не относится к рельсам 3, так как я не провел столько времени с рельсами 3, сколько хотел бы.
Rails создает специальную скрытую таблицу с именем schema_migrations
. Эта таблица содержит один столбец с именем version
. И в этом столбце есть строка для каждой миграции. Значение, являющееся временной меткой, которая соответствует временной метке имени файла миграции.
Когда вы мигрируете, он просматривает все ваши миграции в хронологическом порядке (также бывает в алфавитном порядке из-за соглашения об именовании на основе меток). Для каждой миграции она ищет соответствующую строку в таблице schema_migrations
. Если он не может его найти, он запускает эту миграцию и добавляет временную метку в таблицу. Если он найдет его, он предполагает, что он уже запущен, и просто пропускает его.
В результате 2 разработчика могут одновременно выполнять миграцию в любом порядке, и это нормально. Это потому, что Rails точно знает, какие миграции были выполнены, а какие нет, независимо от того, когда ваша база данных впервые их увидела.
Итак, чтобы сделать что-то подобное, вам просто нужен способ постоянного хранения этого состояния, о том, какие шаги были сделаны, а какие нет.