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.


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,
   ...

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

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

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


Dies gibt Ihnen nicht die aktuelle Version, insbesondere für den Fall, dass Sie keine Migrationen ausgeführt haben.
Adrien
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.