Ruby on Rails - 迁移

Rails 迁移允许您使用 Ruby 定义对数据库架构的更改,从而可以使用版本控制系统使内容与实际代码保持同步。

这有很多用途,包括 −

  • 开发人员团队 − 如果一个人更改了架构,其他开发人员只需更新并运行"rake 迁移"即可。

  • 生产服务器 − 当您推出新版本时,运行"rake 迁移"以使数据库也保持最新状态。

  • 多台机器 −如果您同时在台式机和笔记本电脑上进行开发,或者在多个位置进行开发,迁移可以帮助您保持它们同步。

Rails 迁移可以做什么?

  • create_table(name, options)
  • drop_table(name)
  • rename_table(old_name, new_name)
  • add_column(table_name, column_name, type, options)
  • rename_column(table_name, column_name, new_column_name)
  • change_column(table_name, column_name, type, options)
  • remove_column(table_name, column_name)
  • add_index(table_name, column_name, index_type)
  • remove_index(table_name, column_name)

迁移支持所有基本数据类型 − 以下是迁移支持的数据类型列表 −

  • string − 适用于诸如标题之类的小数据类型。

  • text − 适用于较长的文本数据,例如描述。

  • integer − 适用于整数。

  • float − 适用于小数。

  • datetime 和 timestamp −将日期和时间存储到列中。

  • date 和 time − 仅存储日期或仅存储时间。

  • binary − 用于存储图像、音频或电影等数据。

  • Boolean − 用于存储真值或假值。

有效的列选项是 − 以下是有效列选项的列表。

  • limit ( :limit => “50” )

  • default (:default => “blah” )

  • null (:null => false 表示 NOT NULL)

注意 − Rails Migration 所执行的活动可以使用任何前端 GUI 或直接在 SQL 提示符上完成,但 Rails Migration 使所有这些活动变得非常容易。

有关这些的详细信息,请参阅 Rails API

创建迁移

以下是创建迁移的通用语法 −

application_dir> rails generate migration table_name

这将创建文件 db/migrate/001_table_name.rb。迁移文件包含描述数据库表数据结构的基本 Ruby 语法。

注意 −在运行迁移生成器之前,建议清理模型生成器生成的现有迁移。

我们将创建两个迁移,分别对应我们的三个表 − books 和 subject

Books 迁移应如下所示 −

tp> cd library
library> rails generate migration books

上述命令生成以下代码。

Generate

subject 迁移应如下所示 −

tp> cd library
library> rails generate migration subjects

上述命令生成以下代码。

Generate

请注意,在创建迁移时,book 和 subject 均使用小写字母,而复数形式则使用小写字母。这是 Rails 范例,每次创建迁移时都应遵循此范例。

编辑代码

转到应用程序的 db/migrate 子目录,然后使用任何简单的文本编辑器逐个编辑每个文件。

按如下方式修改 001_books.rb −

ID 列将自动创建,因此也不要在此处执行此操作。

class Books < ActiveRecord::Migration
   
   def self.up
      create_table :books do |t|
         t.column :title, :string, :limit => 32, :null => false
         t.column :price, :float
         t.column :subject_id, :integer
         t.column :description, :text
         t.column :created_at, :timestamp
      end
   end

   def self.down
      drop_table :books
   end
end

方法 self.up 用于迁移到新版本时,self.down 用于在需要时回滚任何更改。此时,上述脚本将用于创建 books 表。

修改 002_subjects.rb 如下 −

class Subjects < ActiveRecord::Migration
   def self.up
      
      create_table :subjects do |t|
         t.column :name, :string
      end
	
      Subject.create :name => "Physics"
      Subject.create :name => "Mathematics"
      Subject.create :name => "Chemistry"
      Subject.create :name => "Psychology"
      Subject.create :name => "Geography"
   end

   def self.down
      drop_table :subjects
   end
end

上述脚本将用于创建 subjects 表,并将在 subject 表中创建五条记录。

运行迁移

现在您已经创建了所有必需的迁移文件。是时候针对数据库执行它们了。为此,请转到命令提示符并转到应用程序所在的库目录,然后键入 rake move,如下所示 −

library> rake db:migrate

如果不存在,这将创建一个"schema_info"表,该表跟踪数据库的当前版本 - 每次新的迁移都将是一个新版本,并且任何新的迁移都将运行,直到您的数据库达到当前版本。

Rake 是一个类似于 Unix make 程序的 Ruby 构建程序,Rails 利用它简化复杂任务的执行,例如更新数据库的结构等。

运行生产和测试数据库的迁移

如果您想指定用于迁移的 Rails 环境,请使用 RAILS_ENV shell 变量。

例如 −

library> export RAILS_ENV = production
library> rake db:migrate
library> export RAILS_ENV = test
library> rake db:migrate
library> export RAILS_ENV = development
library> rake db:migrate

注意 − 在 Windows 中,使用"set RAILS_ENV = production"而不是 export 命令。

下一步是什么?

现在我们有了数据库和所需的表。在后续两章中,我们将探索两个重要组件,即控制器 (ActionController) 和视图 (ActionView)。

  • 创建控制器 (Action Controller)。
  • 创建视图 (Action View)。