У меня есть несколько миграций данных, которые определяют модели. Например:reload rails environment после перенастройки
db/migrate/19600000000000_some_migration.rb
:
class Step < ActiveRecord::Base
end
class SomeMigration < ActiveRecord::Migration
def change
# operations requiring the Step class
end
end
и когда я бег семян сразу после миграции
rake db:migrate db:seed
переопределенного Step
класса все еще находится в памяти. Но мне нужен класс Step
, который изначально был определен в app/models/step.rb
, потому что мои семена полагаются на метод там, иначе он молча провалится.
Есть несколько вещей, которые я могу думать, но ни один из них идеально подходит:
require 'app/models/step.rb'
перед посевом- это на самом деле не работает для меня, потому что она опирается на другую модель, также было пересмотрено в миграции, которая может превратиться в кроличью нору.
Dir["#{File.dirname(__FILE__)}/app/models/**/*.rb"].each { |f| load(f) }
- Я не люблю это, либо, потому что это переопределение констант
- Всегда запускать
rake db:migrate
иrake db:seed
отдельно
Я пытался искал способы перезагрузки всей среды после посева, но ни одна из них не работает:
ActionDispatch::Reloader.cleanup!
Rack::Reloader.new(MyApp).reload!
Любые мысли о том, что самый масштабируемый подход будет?
Выполнить они отдельно в строке: 'грабли БД: мигрировать && грабли БД: seed' –
Too вы можете попробовать это:' Step.connection.schema_cache.clear! Step.reset_column_information' –
Я рекомендую использовать raw sql для изменения данных в процессе миграции или использования задач rake для изменения данных. –