2016-11-16 2 views
0

Я работаю над разными ветками, и на этих ветках есть файлы миграции. Файл schema.rb.Миграция выполняется независимо от ветки

Моя проблема в том, что независимо от того, в какой ветке я нахожусь, текущая миграция изменяет schema.rb так, как если бы она учитывала все миграции по всем ветвям.

Скажите, я создал модель Foo на ветке A с соответствующей таблицей foos, запустил миграцию и переключился на другую ветку.

Запуск какой-либо другая миграции (скажем, создание таблицы bars) на моей текущей ветви B, где нет foos стола, создает его:

# while on branch B 
Foo 
#=> NameError: uninitialized constant Foo 
ActiveRecord::Base.connection.table_exists?('foos') 
#=> true 

Вопрос: Как сделать schema.rb изменить только в соответствии с миграции в текущем филиале?

ответ

2

db:migrate или db:rollback job пишет schema.rb файл из схемы пользовательской базы данных, а не из сценария миграции пользователя. даже если вы меняете ветвь git, ваше состояние базы данных не изменяется. So foos таблица существует но Foo модель не существует.

Ответ: Просто откатить перед проверкой филиала или Написание GIT крючком скрипт для отката каждый раз вы извлекаете ветку

+0

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

+0

@AndreyDeineko как насчет написания скрипта git hook, который сравнивает версию миграции между master и текущей ветвью и откатом. он выполняется при оформлении нового филиала –

0

Вы, вероятно, ваш schema.rb игнорироваться на мерзавца. Одно из решений - не игнорировать этот файл. Взгляните на .gitignore в корневую папку вашего проекта и выберете schema.rb.

Если это не в .gitignore, ваша проблема не имеет отношения к schema.rb, так как она должна быть разной для каждой ветки. Проблема заключается в том, вероятно, что у вас есть только один локальный файл базы данных и вы работаете миграции из разных ветвей на одной и той же базе данных, поэтому вы получите:

ActiveRecord::Base.connection.table_exists?('foos') 
#=> true 

Вы должны иметь другую копию базы данных для каждой отрасли и изменяя его при изменении ветви, на которой вы работаете, либо используя разные конфигурации на config/databases.yml, переменные окружения или вручную изменяя имена файлов базы данных.

+0

не в '.gitignore' –

1

Использование для каждой базы данных филиалов и параметров подключения.

 Смежные вопросы

  • Нет связанных вопросов^_^