Rails Mysql2 :: Таблица ошибок не существует при создании новой миграции

0

Я написал миграцию со следующим (создайте новую таблицу с именами sources):

class CreateSources < ActiveRecord::Migration
  def change
    create_table :sources do |t|
      t.string :name, null: false, default: ""

      t.timestamps null: false
    end
  end
end

И затем я изменил мою существующую модель:

class Property < ActiveRecord::Base
  validates :source, allow_blank: true, inclusion: { in: 
  Source.all.map{ |source| source.name } }

Я хочу добавить подтверждение в источник свойств, чтобы разрешить только источник из таблицы sources.

И затем, когда я запускаю миграцию, я получил следующую ошибку:

ActiveRecord::StatementInvalid: Mysql2::Error: Table 'sources' doesn't exist: SELECT 'sources'.* FROM 'sources'

Проблема заключается в том, что запрос исходной таблицы возникает, когда она еще не была инициализирована.
Любые подсказки о том, как я могу заставить миграцию работать?
Это выполняется на уровне производства. поэтому я не могу отказаться от миграции и перестроить ее.

Версия Rails 4.2.5
SQL-версия 5.7

Теги:
database
migration
ruby-on-rails-4

2 ответа

1
Лучший ответ

Имейте в виду, что ваш Source.all.map{ |source| source.name } Source.all.map{ |source| source.name } будет выполняться при загрузке класса Property. Source класс не может быть правильно инициализирован в этой точке, и может не быть надлежащего подключения к базе данных. Кроме того, вы будете получать доступ только к Source.all поэтому вам придется перезапустить приложение, если вы добавите новый Source.

Вместо этого выполните проверку вручную:

class Property < ActiveRecord::Base
  validate :valid_source
private
  def valid_source
    return if(source.blank?)
    return if(Source.where(name: source).exists?)
    errors.add(:source, 'Unknown source') # Or whatever you want to say
  end
end

Таким образом, вы проверяете таблицу sources в нужное время.

Кроме того, я бы не ожидал ошибки, с которой вы столкнулись при миграции. Возможно, вы используете модель внутри миграции, чего следует избегать.

В стороне, есть ли особая причина, по которой у вас нет belongs_to :source? Копирование имени, похожего на него, очень подвержено ошибкам, использование ссылки (надеюсь, что поддерживается внешним ключом в базе данных) было бы намного безопаснее.

  • 0
    Огромное спасибо. Теперь это работает!! А также я могу знать, как проверить, использую ли я модель внутри миграции? Похоже, я этого не делаю, но это произошло.
  • 0
    Чтобы проверить миграции, вам нужно посмотреть на них вручную или выполнить поиск. Вы также можете проверить ваши инициализаторы, чтобы увидеть, если они что-то делают.
0

Вы определили исходную модель? Я надеюсь, что это так.

Здесь проблема выглядит так: загрузка класса Property имеет приоритет до запуска миграции и, следовательно, проблемы.

  • 0
    Да, я определил это. А также Имущественная миграция выше Исходной миграции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню