migrate用于进行数据库操作,rails中使用migrate的时候会在数据中建立一个schema_migrations表,用以记录migrate运行的记录,每当运行migrate的时候,会首先去检查这张表,看当前migrate 文件的时间戳是否在这张表,如果存在就不会执行这个migrate,所以如果不小心修改migrate文件的时间戳部分的内容,会导致该migrate文件再次执行一遍,从而报错
回滚方式:
1,直接书写
def change
..
end
由rails自身识别,进行回滚
2.reversible do |dir|
dir.up{}
dir.down{}
end
3.单独的up down方法
def up
end
def down
end
脚手架创建迁移文件
rails g migration xxx,默认会生成change方法
支持自动生成代码的类型
1.迁移名为addxxx
后跟字段会生成表字段
2.迁移名removexxxfromxxx
会生成移除字段代码
3.迁移名createJoinTableXxxYyy
创建联合数据表(中间表)Xxx Yyy
4.迁移名为AddXxxToYyy,并且后面跟上关联的模型如
rails g migration AddUserToArticles user:references
会识别出是给user 和article建立关联,添加关联模型
5.在字段类型后面跟{}并添加选项,可以修饰字段
如,添加多态关联
rails g migration AddUserRefToArticles user:references{polymorphic}
这样生成的migrate文件如下
class AddUserRefToArticles < ActiveRecord::Migration
def change
add_reference :articles, :user, polymorphic: true, index: true
end
end
6.create_table方法,用于创建数据表并添加表中字段
create_table :articles do |t|
t.string name
end
7.change_table用于修改数据表,可以提供比create_table更多的用法
change_table :articles do |t|
t.text :name
表示增加字段
t.remove :name
移除字段
t.rename :name.:title
重命名字段
稳重的蜡烛
给字段添加索引
8.回滚
rake db:rollback用于回滚
可用选项
STEP=x,回滚几次迁移(注意一次迁移指的是一个migrate文件)
rake db:migrate:redo STEP=1
回滚之后重做一次迁移
执行或者回滚指定迁移
rake db:migrate:up VERSION=20170717123350
rake db:migrate:down VERSION=20170717123350
就算migrate文件中没有up down方法也可以运行
9.建议
有时编写的迁移中可能有错误,如果已经运行了迁移,不能直接编辑迁移文件再运行迁移。Rails 认为这个迁移已经运行,所以执行 rake db:migrate 任务时什么也不会做。这种情况必须先回滚迁移(例如,执行 rake db:rollback 任务),编辑迁移文件后再执行 rake db:migrate 任务执行改正后的版本。
一般来说,直接修改现有的迁移不是个好主意。这么做会为你以及你的同事带来额外的工作量,如果这个迁移已经在生产服务器上运行过,还可能带来不必要的麻烦。你应该编写一个新的迁移,做所需的改动。编辑新生成还未纳入版本控制的迁移(或者更宽泛地说,还没有出现在开发设备之外),相对来说是安全的。