Rails 4 hoe in behandeling zijnde migraties te negeren

Het volgende probleem is:

  • Ik heb db/seed.rb vol met initiële gegevens.
  • Een van de migraties hangt af van de gegevens die deze seed levert.
  • Ik probeer mijn app te implementeren vanuit een lege database.

Resultaat is:

  • RAILS_ENV=production rake db:migrate – mislukt vanwege gebrek aan initiële gegevens
  • RAILS_ENV=production rake db:seed – mislukt vanwege lopende migraties

Ik wilde rake op de een of andere manier vertellen om lopende migraties te negeren, maar tot nu toe niet in staat om het te doen.

UPDATE (vanwege extra ervaring)

Soms lopen migraties en modelcode niet synchroon, waardoor migraties niet worden uitgevoerd.
Om dit probleem te voorkomen, is onlangs het model opnieuw gedefinieerd in migraties:

# reset all callbacks, hooks, etc for this model
class MyAwesomeModel < ActiveRecord::Base
end
class DoSomethingCool < ActiveRecord::Migration
  def change
    ...
  end
end

Antwoord 1, autoriteit 100%

Ik weet niet zeker of dit je zal helpen. Maar ik was op zoek naar iets en vond deze vraag. Het lijkt er dus op dat dit kan helpen:

In RAILS_ROOT/config/environments/development.rb
Stel de volgende instelling in op false:

config.active_record.migration_error = false#:page_load

In mijn situatie wordt de lopende migratiefout nu niet meer weergegeven. Zou ook moeten werken voor rake-taken en console voor dezelfde omgeving.


Antwoord 2, autoriteit 23%

Hernoem de migratie afhankelijk van de gegevens van:

20140730091353_migration_name.rb

naar

.20140730091353_migration_name.rb

(voeg een punt toe aan het begin van de bestandsnaam)

Voer vervolgens rake db:seeduit (het zal niet langer klagen over de lopende migraties) en hernoem de migratie vervolgens.

Als je daarna meer migraties hebt, moet je ze allemaal hernoemen of tijdelijk verplaatsen.


Antwoord 3, autoriteit 8%

Rails slaat migratie-informatie op in een tabel met de naam schema_migrations.

U kunt de versie van uw migratie aan die tabel toevoegen om een ​​specifieke migratie over te slaan.

De versie is de cijferreeks die vóór de beschrijving in de bestandsnaam komt.

[version]_Create_Awesome.rb

Antwoord 4, autoriteit 2%

Ik had een soortgelijk probleem. Ik heb commentaar gegeven op de add_column-regels en heb de rake db:migrate-opdrachten uitgevoerd en vervolgens de opmerking verwijderd wanneer ik deze nodig heb voor de test- of productieomgeving.


Antwoord 5

Er is geen manier, tenzij je de Rails-code aap patcht. Ik raad je ten zeerste aan om in plaats daarvan je migraties op te lossen.

Een migratie mag niet afhankelijk zijn van het bestaan ​​van bepaalde gegevens in de database. Het kan afhangen van een eerdere migratie, maar natuurlijk absoluut niet van de gegevens op de db.


Antwoord 6

Als u het probleem ‘in behandeling zijnde migraties’ bent tegengekomen toen u probeerde uw gegevens te seeden vanuit een lopendeRails-toepassing, kunt u dit eenvoudig rechtstreeks aanroepen, waardoor de abort_if_pending_migrationswordt vermeden. controleer:

ActiveRecord::Tasks::DatabaseTasks.load_seed

Zie waar zaden daadwerkelijk worden aangeroepen vanuit ActiveRecord:

https ://github.com/rails/rails/blob/v6.0.3.2/activerecord/lib/active_record/railties/databases.rake#L331

en bekijk de DatabaseTasks-documenten:

https://apidock.com/rails/v6.0.0/ActiveRecord /Tasks/DatabaseTasks
https://apidock.com/rails/v6.0.0/ActiveRecord/ Taken/DatabaseTasks/load_seed

Other episodes