ruby在创建数据库前要创建迁移。下面就是创建迁移的方法。
迁移文件存储在 db/migrate
文件夹中,每个迁移保存在一个文件中。文件名采用 YYYYMMDDHHMMSS_create_products.rb
形式,即一个 UTC 时间戳后加以下划线分隔的迁移名。迁移的类名(驼峰式)要和文件名时间戳后面的部分匹配。例如,在 20080906120000_create_products.rb
文件中要定义 CreateProducts
类;在 20080906120001_add_details_to_products.rb
文件中要定义 AddDetailsToProducts
类。文件名中的时间戳决定要运行哪个迁移,以及按照什么顺序运行。从其他程序中复制迁移,或者自己生成迁移时,要注意运行的顺序。
自己计算时间戳不是件简单的事,所以 Active Record 提供了一个生成器:
$ rails generate migration AddPartNumberToProducts
这个命令生成一个空的迁移,但名字已经起好了:
class AddPartNumberToProducts < ActiveRecord::Migration def change end end
如果迁移的名字是“AddXXXToYYY”或者“RemoveXXXFromYYY”这种格式,而且后面跟着一个字段名和类型列表,那么迁移中会生成合适的 add_column
或 remove_column
语句。
$ rails generate migration AddPartNumberToProducts part_number:string
这个命令生成的迁移如下:
class AddPartNumberToProducts < ActiveRecord::Migration def change add_column :products, :part_number, :string end end
如果想为新建的字段创建添加索引,可以这么做:
$ rails generate migration AddPartNumberToProducts part_number:string:index
这个命令生成的迁移如下:
class AddPartNumberToProducts < ActiveRecord::Migration def change add_column :products, :part_number, :string add_index :products, :part_number end end
类似地,还可以生成删除字段的迁移:
$ rails generate migration RemovePartNumberFromProducts part_number:string
这个命令生成的迁移如下:
class RemovePartNumberFromProducts < ActiveRecord::Migration def change remove_column :products, :part_number, :string end end
迁移生成器不单只能创建一个字段,例如:
$ rails generate migration AddDetailsToProducts part_number:string price:decimal
生成的迁移如下:
class AddDetailsToProducts < ActiveRecord::Migration def change add_column :products, :part_number, :string add_column :products, :price, :decimal end end
如果迁移名是“CreateXXX”形式,后面跟着一串字段名和类型声明,迁移就会创建名为“XXX”的表,以及相应的字段。例如:
$ rails generate migration CreateProducts name:string part_number:string
生成的迁移如下:
class CreateProducts < ActiveRecord::Migration def change create_table :products do |t| t.string :name t.string :part_number end end end
生成器生成的只是一些基础代码,你可以根据需要修改 db/migrate/YYYYMMDDHHMMSS_add_details_to_products.rb
文件,增删代码。
在生成器中还可把字段类型设为 references
(还可使用 belongs_to
)。例如:
$ rails generate migration AddUserRefToProducts user:references
生成的迁移如下:
class AddUserRefToProducts < ActiveRecord::Migration def change add_reference :products, :user, index: true end end
这个迁移会创建 user_id
字段,并建立索引。
如果迁移名中包含 JoinTable
,生成器还会创建联合数据表:
$ rails g migration CreateJoinTableCustomerProduct customer product
生成的迁移如下:
class CreateJoinTableCustomerProduct < ActiveRecord::Migration def change create_join_table :customers, :products do |t| # t.index [:customer_id, :product_id] # t.index [:product_id, :customer_id] end end end