Міграція рейок: найкращий спосіб отримати поточну версію міграції


78

Чи є хороший спосіб отримати номер версії міграції?

Мені потрібно реалізувати метод у моделі, яка поводиться по-різному як у певній версії міграції, так і поза нею.

Я виявив, що accept_migrated_upto_version у адаптері підключення отримує версію з бази даних, але не можу знайти інших.


Передумови: Я намагаюся видалити два стовпці з таблиці A, хочу перемістити їх у таблицю B і додати асоціацію до таблиці B із таблиці A.

Під час цієї зміни мені потрібно отримати доступ до цих двох стовпців. але після цього я хочу додати метод проксі для цих стовпців для сумісності.


Чому у вас є код, який поводиться по-різному з версіями міграції Wrt? Будь ласка, поясни, будь ласка.
Ятін Ганхотра

Правильно. Я додав передумови до запитання.
shigeya

Відповіді:


103

Рейки 5.2та вище:

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

 
Рейки до 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
Примітка: ActiveRecord::Migrator.get_all_versionsце НЕ включає очікують міграції. Він включає лише міграції, які вже були запущені.
Джошуа Пінтер

1
ActiveRecord::Migrator.get_all_versionsне працює в Rails 6. Використання: ApplicationRecord.connection.migration_context.current_version ApplicationRecord.connection.migration_context.get_all_versionsдля Rails 6.
Marian13

144

Є набагато приємніший спосіб: rake db:migrate:status

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

Вказуючи на те, що я видалив свій останній файл міграції.

Або простіше:

> rake db:version
Current version: 20120613030015

5
Дякую. Я це знаю, але мені потрібно було отримати це програмно, під час міграції.
shigeya

2

Для рейок 5.x / 6.x:

puts ApplicationRecord.connection.migration_context.current_version
puts ApplicationRecord.connection.migration_context.get_all_versions

1

Якщо ви не хочете робити це без завантаження програми, ви можете створити такий сценарій:

#!/usr/bin/env ruby

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

Зверніть увагу, що rootрядок пов’язаний з тим, що мій сценарій знаходиться в binдиректорії


Це не дає вам поточної версії, особливо у випадку, якщо ви не запускали міграції.
Адріен,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.