Средства проверки модели Rails прерывают более ранние миграции
-
09-06-2019 - |
Вопрос
У меня есть последовательность миграций в приложении rails, которая включает в себя следующие шаги:
- Создайте базовую версию модели "пользователь"
- Создайте экземпляр этой модели - в моей системе должен быть хотя бы один начальный пользователь, чтобы вы могли войти в систему и начать ее использовать
- Обновите модель "user", чтобы добавить новое поле / столбец.
Теперь я использую "validates_inclusion_of" для этого нового поля / столбца.Это прекрасно работало на моей первоначальной машине разработки, на которой уже была база данных с примененными этими миграциями.Однако, если я перейду на новую машину и выполню все миграции, шаг 2 завершится неудачей, потому что validates_inclusion_of завершится неудачей, потому что поле из миграции 3 еще не добавлено в класс модели.
В качестве обходного пути я могу закомментировать строку "validates_ ...", запустить миграцию и раскомментировать ее, но это нехорошо.
Лучше было бы изменить порядок моих миграций, чтобы создание пользователя (шаг 2) было последним, после добавления всех столбцов.
Однако я новичок в rails, поэтому я подумал, что хотел бы спросить, каков предпочтительный способ справиться с этой ситуацией :)
Решение
Самый простой способ избежать этой проблемы - использовать rake db:schema:load на втором компьютере вместо db: migrate.D: S: L использует schema.rb для загрузки самой последней версии вашей схемы, в отличие от переноса ее с нуля.
Если вы столкнетесь с этой проблемой при развертывании на рабочей машине (где важно сохранить данные), вам, вероятно, придется объединить ваши миграции в один файл без конфликтов.
Другие советы
Вы можете объявить класс с тем же именем внутри миграции, он переопределит класс вашего приложения / модели:
class YourMigration < ActiveRecord::Migration
class User < ActiveRecord::Base; end
def self.up
# User.create(:name => 'admin')
end
end
К сожалению, ваша IDE может попытаться выполнить автозаполнение на основе этого класса (это делает Netbeans), и вы не сможете использовать там свою логику модели (за исключением случаев, когда вы ее дублируете).
Я должен сделать это прямо сейчас.Основываясь на совете БиХи, я загружаю модель вручную, а затем переопределяю методы там, где мне нужно.
load(File.join(RAILS_ROOT,"app/models/user.rb"))
class User < ActiveRecord::Base
def before_validation; nil; end # clear out the breaking before_validation
def column1; "hello"; end # satisfy validates_inclusion_of :column1
end