这是一个使用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版本?
答案 0 :(得分:33)
因为Active Record想知道迁移是在哪个版本中生成的。有时,迁移中的默认值可以在Rails版本之间发生变化(当我说Rails发布时我正在讨论Rails的发布框架,而不是轨道宝石)。
所以,让我们说你有一个类似的迁移:
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字节的字符串列。
答案 1 :(得分:3)
如果从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