ActiveRecord :: Migration弃用警告 - 请求Rails版本,但我没有使用Rails

max*_*ner 11 activerecord ruby-on-rails ruby-on-rails-5

这是一个Ruby非Web项目,它使用ActiveRecord与数据库进行通信.

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

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
Run Code Online (Sandbox Code Playgroud)

问题是关于这一行:

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]
Run Code Online (Sandbox Code Playgroud)

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

  class Migrations < ActiveRecord::Migration[4.2]
Run Code Online (Sandbox Code Playgroud)

然后我不再收到警告.

我想知道是否有人可以解释这个的目的.

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

指定Rails版本?

raf*_*nca 33

因为Active Record想知道迁移是在哪个版本中生成的.有时,迁移中的默认值可以在Rails版本之间发生变化(当我说Rails版本时,我正在谈论Rails的发布框架,而不是轨道宝石).

所以,假设你有一个迁移:

create_table :todos do |t|
  t.string :content
end
Run Code Online (Sandbox Code Playgroud)

它是使用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字节的字符串列.

  • 哇!@rafaelfranca!谢谢你在这里解释..;)+1 (3认同)
  • 这对于在轨道之外使用AR的人来说是有道理的. (3认同)