Валидаторы модели Rails ломают ранние миграции - PullRequest
5 голосов
/ 15 сентября 2008

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

  1. Создание базовой версии модели 'user'
  2. Создайте экземпляр этой модели - в моей системе должен быть хотя бы один начальный пользователь, чтобы вы могли войти в систему и начать использовать его
  3. Обновите модель 'user', добавив новое поле / столбец.

Теперь я использую «validates_inclusion_of» в этом новом поле / столбце. Это отлично работало на моей первоначальной машине для разработки, на которой уже была база данных с этими миграциями. Однако, если я иду на новую машину и запускаю все миграции, шаг 2 завершается неудачно, потому что validates_inclusion_of завершается неудачей, потому что поле из миграции 3 еще не добавлено в класс модели.

В качестве обходного пути я могу закомментировать строку «validates _...», запустить миграцию и раскомментировать ее, но это нехорошо.

Лучше было бы изменить порядок моих миграций, чтобы создание пользователя (шаг 2) было последним после добавления всех столбцов.

Хотя я новичок в рельсах, так что я подумал, что спросить, какой предпочтительный способ справиться с этой ситуацией:)

Ответы [ 3 ]

5 голосов
/ 15 сентября 2008

Вы можете объявить класс с тем же именем внутри миграции, он заменит ваше приложение / модель один:

class YourMigration < ActiveRecord::Migration

  class User < ActiveRecord::Base; end

  def self.up
    # User.create(:name => 'admin')
  end

end

К сожалению, ваша IDE может попытаться выполнить автозаполнение на основе этого класса (Netbeans делает), и вы не можете использовать там логику вашей модели (кроме случаев, когда вы ее дублируете).

5 голосов
/ 15 сентября 2008

Самый простой способ избежать этой проблемы - использовать rake db: schema: load на втором компьютере вместо db: migrate. D: S: L использует schema.rb для загрузки самой последней версии вашей схемы, а не переносит ее с нуля.

Если вы столкнетесь с этой проблемой при развертывании на производственном компьютере (где важно сохранение данных), вам, вероятно, придется объединить миграции в один файл без конфликтов.

0 голосов
/ 23 сентября 2009

Я должен сделать это прямо сейчас. Опираясь на рекомендации BiHi, я загружаю модель вручную, а затем переопределяю методы там, где мне нужно.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...