我可以在Rails 4及更高版本中使用change_column方法回滚吗?

时间:2016-10-21 15:35:29

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5 rails-activerecord rails-migrations

change_column方法在Rails 4及更高版本的迁移中使用时是否能够回滚?

以下是一个例子:

def change
  change_column etc
end

我应该使用updown方法吗?

4 个答案:

答案 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

乍一看,这似乎比使用updown更复杂。优点是,您可以将其与可逆迁移混合使用 如果您向表中添加了一堆字段并且必须更改视图字段,则可以将change_tableadd_columnreversible一起使用以进行干净且紧凑的迁移:< / 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应该如何知道更改前列的类型/名称/列数? :)

因此,如果您计划来回滚动,您可能希望尽可能明确,因此使用updown是一个非常好(最好的,实际上)的想法。< / p>

答案 2 :(得分:0)

您也可以使用

change_column_null(table_name, column_name, null, default = nil)

保存一些代码。 Activerecord知道如何回滚此活动。

答案 3 :(得分:-1)

使用更改来恢复以前的迁移应该非常好。