2016-12-09 6 views
1

У меня есть несколько миграций данных, которые определяют модели. Например: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, потому что мои семена полагаются на метод там, иначе он молча провалится.

Есть несколько вещей, которые я могу думать, но ни один из них идеально подходит:

  1. require 'app/models/step.rb' перед посевом
    • это на самом деле не работает для меня, потому что она опирается на другую модель, также было пересмотрено в миграции, которая может превратиться в кроличью нору.
  2. Dir["#{File.dirname(__FILE__)}/app/models/**/*.rb"].each { |f| load(f) }
    • Я не люблю это, либо, потому что это переопределение констант
  3. Всегда запускать rake db:migrate и rake db:seed отдельно

Я пытался искал способы перезагрузки всей среды после посева, но ни одна из них не работает:

  • ActionDispatch::Reloader.cleanup!
  • Rack::Reloader.new(MyApp).reload!

Любые мысли о том, что самый масштабируемый подход будет?

+0

Выполнить они отдельно в строке: 'грабли БД: мигрировать && грабли БД: seed' –

+0

Too вы можете попробовать это:' Step.connection.schema_cache.clear! Step.reset_column_information' –

+0

Я рекомендую использовать raw sql для изменения данных в процессе миграции или использования задач rake для изменения данных. –

ответ

1

Попробуйте

class SomeMigration < ActiveRecord::Migration 
    class Step < ActiveRecord::Base 
    end 

    def change 
    # operations requiring the Step class 
    end 
end 
Смежные вопросы