change_column
方法在Rails 4及更高版本的迁移中使用时是否能够回滚?
以下是一个例子:
def change
change_column etc
end
我应该使用up
和down
方法吗?
答案 0 :(得分:14)
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
乍一看,这似乎比使用up
和down
更复杂。优点是,您可以将其与可逆迁移混合使用
如果您向表中添加了一堆字段并且必须更改视图字段,则可以将change_table
和add_column
与reversible
一起使用以进行干净且紧凑的迁移:< / p>
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
答案 1 :(得分:1)
可以使用rails 4中的change_columns回滚迁移 导轨5:
def change end
是的,可以使用空(以及正确的非空)change
方法回滚迁移。
当您确实在那里拥有某些内容时,如果您未指定所删除列的类型,则可能无法使用remove_column
恢复迁移。
另外,例如,如果change_column
方法中有change
。如果不是来自down
方法,Rails应该如何知道更改前列的类型/名称/列数? :)
因此,如果您计划来回滚动,您可能希望尽可能明确,因此使用up
和down
是一个非常好(最好的,实际上)的想法。< / p>
答案 2 :(得分:0)
您也可以使用
change_column_null(table_name, column_name, null, default = nil)
保存一些代码。 Activerecord知道如何回滚此活动。
答案 3 :(得分:-1)
使用更改来恢复以前的迁移应该非常好。