ActiveRecord::迁移弃用警告 - 要求 Rails 版本,但我没有使用 Rails



这是一个使用ActiveRecord与数据库通信的Ruby非Web项目。

有一个文件包含数据库连接代码、迁移和模型。看这里(但没有必要阅读这篇文章来回答这个问题)

require 'sqlite3'
require 'active_record'
require 'yaml'
require 'active_support/all'
require 'securerandom'
BasePath = "#{File.dirname(__FILE__)}/.."
DATABASE_FILENAME = "database.sqlite"
DATABASE_PATH = "#{BasePath}/#{DATABASE_FILENAME}"
SQLite3::Database.new(DATABASE_PATH)
ActiveRecord::Base.establish_connection(
  adapter: 'sqlite3',
  database: DATABASE_PATH
)
class Migrations < ActiveRecord::Migration
  def up
    create_table :todos do |t|
      t.string :content
      t.boolean :completed
      t.timestamps null: false
    end
  end
  def down
    puts "backing up database".red_on_black if File.file?(DATABASE_PATH)
    loop { (`cp #{DATABASE_PATH} #{DATABASE_PATH}-#{SecureRandom.urlsafe_base64}.backup`; break) rescue next }
    sleep 0.5
    drop_table :todos
    puts "dropped todos table"
  end
end # Migrations
class Todo < ActiveRecord::Base
end

问题是关于这一行:

class Migrations < ActiveRecord::Migration

当我使用 Migrations.migrate(:up) 运行迁移时,我收到弃用警告:

DEPRECATION WARNING: Directly inheriting from ActiveRecord::Migration is deprecated.
Please specify the Rails release the migration was written for:
  class Migrations < ActiveRecord::Migration[4.2]

就像它建议我将我的类定义更改为

  class Migrations < ActiveRecord::Migration[4.2]

然后我不再收到警告。

我想知道是否有人可以解释这样做的目的。

我的应用程序不依赖于任何版本的 Rails。为什么我需要

以指定 Rails 版本?

因为活动记录想知道迁移是在哪个版本中生成的。有时迁移中的默认值可以在 Rails 版本之间更改(当我说 Rails 版本时,我说的是框架 Rails 的发布,而不是 Rails gem)。

因此,假设您有一个迁移,如下所示:

create_table :todos do |t|
  t.string :content
end

它是用Active Record 4.2(以及Rails 4.2版本)生成的。在 Rails 4.2 中,字符串列的默认大小为 4 字节。在 Rails 5.0 中,Rails 团队决定将默认大小更改为 8 字节。如果将 gem 升级到 5.0 回滚此迁移并再次运行,则数据库将具有大小为 8 字节的字符串列。

如果在迁移中指定版本,则无论您使用哪个版本的 Active Record,都将始终使用生成的 Rails 版本中的默认值生成列。在我的示例中,如果您指定 4.2 作为版本,它将始终是一个 4 字节的字符串列。

如果从 rails 4 升级到 rails 5 ,您只需在回滚或删除后将版本号添加到迁移中即可:

导轨 4.2.6

class CreateStudents < ActiveRecord::Migration
  def change
    create_table :students do |t|
      t.belongs_to :user, index: true
      t.string :first_name
      t.string :last_name
      t.string :phone
      t.timestamps null: false
    end
  end
end

导轨 5.1.3

class CreateStudents < ActiveRecord::Migration[5.1]
  def change
    create_table :students do |t|
      t.belongs_to :user, index: true
      t.string :first_name
      t.string :last_name
      t.string :phone
      t.timestamps null: false
    end
  end
end

最新更新