Как на самом деле работает rake db :: migrate - PullRequest
8 голосов
/ 23 ноября 2011

Я только что начал с Ruby и Rails, и одна из вещей, которые мне действительно нравятся, это соглашения, которые он заставляет вас использовать.

Я хочу подражать этому поведению в своемРубиновые проекты.

Мой вопрос: как это на самом деле работает?Я знаю, что могу просматривать код Rails, но в моем понимании недостаточно, чтобы понять, что в нем происходит.

Я знаю, что он берет базовый сценарий, а затем запускает изменения схемы обновления дляЭто.Но как он узнает, на какой версии?Как бы я имитировать это в другой платформе / базе данных?

1 Ответ

23 голосов
/ 23 ноября 2011

Примечание. Это верно для Rails 2.x. Возможно, это не относится к рельсам 3, так как я не провел столько времени с рельсами 3, сколько хотел бы.

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

Когда вы мигрируете, он просматривает все ваши миграции в хронологическом порядке (также бывает в алфавитном порядке из-за соглашения об именовании на основе меток). Для каждой миграции она ищет соответствующую строку в таблице schema_migrations. Если он не может его найти, он запускает эту миграцию и добавляет временную метку в таблицу. Если он найдет его, он предполагает, что он уже запущен, и просто пропускает его.

В результате 2 разработчика могут одновременно выполнять миграцию в любом порядке, и это нормально. Это потому, что Rails точно знает, какие миграции были выполнены, а какие нет, независимо от того, когда ваша база данных впервые их увидела.

Итак, чтобы сделать что-то подобное, вам просто нужен способ постоянного хранения этого состояния, о том, какие шаги были сделаны, а какие нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...