ActiveRecord::Migration 弃用警告 - 要求 Rails 版本,但我没有使用 Rails
ActiveRecord::Migration deprecation warning - asks for Rails version, but I'm not using Rails
这是一个 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
问题是关于这一行的:
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 定义更改为
class Migrations < ActiveRecord::Migration[4.2]
然后我不再收到警告。
我想知道是否有人可以解释此目的。
我的应用程序不依赖于 Rails 的任何版本。为什么我需要
要指定 Rails 版本?
因为 Active Record 想知道迁移是在哪个版本中生成的。有时迁移中的默认值可以在 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
,您可以在回滚或删除后像这样将版本号添加到迁移中:
Rails 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
Rails 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
这是一个 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
问题是关于这一行的:
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 定义更改为
class Migrations < ActiveRecord::Migration[4.2]
然后我不再收到警告。
我想知道是否有人可以解释此目的。
我的应用程序不依赖于 Rails 的任何版本。为什么我需要
要指定 Rails 版本?
因为 Active Record 想知道迁移是在哪个版本中生成的。有时迁移中的默认值可以在 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
,您可以在回滚或删除后像这样将版本号添加到迁移中:
Rails 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
Rails 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