Я написал миграцию со следующим (создайте новую таблицу с именами 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
Имейте в виду, что ваш 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
? Копирование имени, похожего на него, очень подвержено ошибкам, использование ссылки (надеюсь, что поддерживается внешним ключом в базе данных) было бы намного безопаснее.
Вы определили исходную модель? Я надеюсь, что это так.
Здесь проблема выглядит так: загрузка класса Property имеет приоритет до запуска миграции и, следовательно, проблемы.