Rails迁移:检索当前迁移版本的最佳方法


78

有没有好的方法来检索迁移版本号?

我需要在模型中实现一个方法,该方法在特定的迁移版本之上和之外具有不同的行为。

我发现连接适配器中的假定为_migrated_upto_version正在从数据库检索版本,但找不到其他版本。


背景:我正在尝试从表A中删除两列,想将它们移到表B中,并从表A添加到表B的关联。

在此更改期间,我需要访问这两列。但是在那之后,我想为这些列添加代理方法以实现兼容性。


为什么您的代码在迁移版本中表现不同。请您解释一下。
贾汀

对。我在问题中添加了背景。
shigeya 2012年

Answers:


103

Rails5.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 2012年

2

对于Rails 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目录中


这不会为您提供当前版本,尤其是在您未运行迁移的情况下。
阿德里安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.