Средства проверки модели Rails прерывают более ранние миграции

StackOverflow https://stackoverflow.com/questions/62038

Вопрос

У меня есть последовательность миграций в приложении rails, которая включает в себя следующие шаги:

  1. Создайте базовую версию модели "пользователь"
  2. Создайте экземпляр этой модели - в моей системе должен быть хотя бы один начальный пользователь, чтобы вы могли войти в систему и начать ее использовать
  3. Обновите модель "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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top