Rails 迁移:如何检索当前迁移版本?

95

有没有一种好的方法来检索最新的迁移版本号?

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

我发现连接适配器中的assume_migrated_upto_version可以从数据库中检索版本,但找不到其他方法。


为什么你的代码在迁移版本方面表现不同?能否请你解释一下。 - Jatin Ganhotra
好的。我在问题中添加了背景。 - shigeya
4个回答

166

有一个更好的方法:rails db:migrate:status

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

我删除了最新的迁移文件。

更简单地说:

> rails db:version
Current version: 20120613030015

注意:对于 Rails 版本低于 5.0 的情况,将 rails 替换为 rake


5
谢谢。我知道这一点,但我需要以程序方式在迁移中检索它。 - shigeya

119

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


针对Rails版本 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 不包括待处理的迁移。它仅包括已经运行的迁移。 - Joshua Pinter
2
ActiveRecord::Migrator.get_all_versions 在 Rails 6 中无法使用。 请使用以下代码: ApplicationRecord.connection.migration_context.current_version ApplicationRecord.connection.migration_context.get_all_versions 来替代。 - Marian13

3

对于Rails 5.x/6.x:

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

2
如果您不想在加载应用程序的情况下执行此操作,可以创建如下脚本:
#!/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目录中。

1
这不会给你当前版本,特别是在你没有运行迁移的情况下。 - Adrien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接