Rails-Migration: Der beste Weg, um die aktuelle Migrationsversion abzurufen

75

Gibt es eine gute Möglichkeit, die Versionsnummer der Migration abzurufen?

Ich muss eine Methode in einem Modell implementieren, die sich bei und über eine bestimmte Migrationsversion hinaus anders verhält.

Ich habe festgestellt, dass davon ausgegangen wird, dass_migrated_upto_version im Verbindungsadapter die Version aus der Datenbank abruft, aber keine anderen finden kann.


Hintergrund: Ich versuche, zwei Spalten aus Tabelle A zu entfernen, sie in Tabelle B zu verschieben und der Tabelle B aus Tabelle A eine Zuordnung hinzuzufügen.

Während dieser Änderung muss ich auf diese beiden Spalten zugreifen. Danach möchte ich aus Kompatibilitätsgründen eine Proxy-Methode für diese Spalten hinzufügen.

Shigeya
quelle
Warum haben Sie Code, der sich bei Migrationsversionen anders verhält? Würden Sie bitte erklären.
Jatin Ganhotra
Richtig. Ich habe Hintergrundinformationen in die Frage eingefügt.
Shigeya

Antworten:

100

Schienen 5.2und höher:

> ApplicationRecord.connection.migration_context.current_version
   (0.3ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
=> 20200510093804

> ApplicationRecord.connection.migration_context.get_all_versions
   (0.3ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
=> [20191005164928,
    20191006111502,
   ...

 
Schienen bis 5.1.7:

> ActiveRecord::Migrator.current_version
   (0.2ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" 
=> 20120110085802

> ActiveRecord::Migrator.get_all_versions
   (0.3ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" 
=> [20111114121610,
    20111115091108,
   ...
Jibiel
quelle
2
HINWEIS: ActiveRecord::Migrator.get_all_versionsist nicht enthalten anstehend Migrationen. Es enthält nur Migrationen, die bereits ausgeführt wurden.
Joshua Pinter
1
ActiveRecord::Migrator.get_all_versionsfunktioniert nicht in Rails 6. Verwendung: ApplicationRecord.connection.migration_context.current_version ApplicationRecord.connection.migration_context.get_all_versionsfür Rails 6.
Marian13
143

Es gibt einen viel schöneren Weg: rake db:migrate:status

up     20120530222941  Create shenanigans
up     20120613030015  *** NO FILE ***

Zeigt an, dass ich meine letzte Migrationsdatei gelöscht habe.

Oder einfacher:

> rake db:version
Current version: 20120613030015
Peter Ehrlich
quelle
5
Vielen Dank. Ich weiß das, aber ich musste es programmgesteuert in einer Migration abrufen.
Shigeya
2

Für Schienen 5.x / 6.x:

puts ApplicationRecord.connection.migration_context.current_version
puts ApplicationRecord.connection.migration_context.get_all_versions
Shai Coleman
quelle
1

Wenn Sie dies nicht tun möchten, ohne Ihre App zu laden, können Sie ein Skript wie das folgende erstellen:

#!/usr/bin/env ruby

root = File.expand_path("../..", __FILE__)
lines = `ls #{root}/db/migrate`
puts lines.split("\n").last.split(" ").last.split("_").first

Beachten Sie, dass sich die rootZeile in einem binVerzeichnis befindet

Tony
quelle
Dies gibt Ihnen nicht die aktuelle Version, insbesondere für den Fall, dass Sie keine Migrationen ausgeführt haben.
Adrien