迁移文件存储在 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:index
这样会生成一个添迁移,如:
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
add_index :products, :part_number
end
end
这个迁移会在你的表中添加相应的键。同理把add换成remove就是在表中移除。
有时多人合作的工程需要修改数据表,这时我们不能用rake回滚再迁移,因为这么做可能会影响别人的数据表。所以我们可以通过这种方法来实现对数据库的修改。
$ rails generate migration UpdataPartNumberFromProducts part_number:string
生成迁移
class RemovePartNumberFromProducts < ActiveRecord::Migration
def change
remove_column :products, :part_number, :string
add_column :product, :name. :string
end
end
是指在products中删除part_number,属性为string,的键在添加name,属性string的键。