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 endend
?如果迁移的名字是“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 endend
?如果想为新建的字段创建添加索引,可以这么做:
?
?
?
$ 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 endend
?类似地,还可以生成删除字段的迁移:
?
?
?
$ rails generate migration RemovePartNumberFromProducts part_number:string
?这个命令生成的迁移如下:
class RemovePartNumberFromProducts < ActiveRecord::Migration def change remove_column :products, :part_number, :string endend
?迁移生成器不单只能创建一个字段,例如:
?
?
?
$ 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 endend
?如果迁移名是“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 endend
?
生成器生成的只是一些基础代码,你可以根据需要修改?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 endend
?
这个迁移会创建?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 endend
?
?