change_column
方法是否能够在Rails 4及更高版本的迁移中使用时回滚?
这是一个例子:
def change
change_column etc
end
我应该使用up
和down
方法吗?
change_column
默认情况下无法恢复。 Rails在迁移之前无法知道列定义,因此无法回滚到此原始定义。
因此,从Rails 4开始,您可以为Rails提供必要的信息。这就是reversible方法的用途:
def change
reversible do |dir|
dir.up do
change_column :users, :score, :decimal, precision: 6, scale: 2
end
dir.down do
change_column :users, :score, :decimal, precision: 4, scale: 2
end
end
end
乍一看,这似乎比使用up
and down
更复杂。优点是,您可以将其与可逆迁移混合使用。
如果你向一个表添加一堆字段并且必须改变视图字段,你可以使用change_table
和add_column
以及reversible
进行干净而紧凑的迁移:
def change
change_table :users do |t|
t.string :address
t.date :birthday
# ...
end
reversible do |dir|
dir.up do
change_column :users, :score, :decimal, precision: 6, scale: 2
end
dir.down do
change_column :users, :score, :decimal, precision: 4, scale: 2
end
end
end
可以使用rails 4或rails 5中的change_columns回滚迁移:
def change end
是的,可以使用空(以及正确的非空)change
方法回滚迁移。
当你在那里实际拥有某些东西时,如果你没有指定你删除的列的类型,你可能无法使用例如remove_column
恢复迁移。
另外,例如,如果你在change_column
方法中有change
。如果不是来自down
方法,Rails应该如何知道更改前列的类型/名称/列数? :)
因此,如果您计划来回滚动,您可能希望尽可能明确,因此使用up
和down
是一个非常好(最好的,实际上)的想法。
你也可以使用
change_column_null(table_name, column_name, null, default = nil)
保存一些代码。 Activerecord知道如何回滚这个。
使用更改来恢复以前的迁移应该完全没问题。