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

问题描述 投票:7回答:4

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

这是一个例子:

def change
  change_column etc
end

我应该使用updown方法吗?

ruby-on-rails ruby-on-rails-4 ruby-on-rails-5 rails-activerecord rails-migrations
4个回答
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
end

乍一看,这似乎比使用upand down更复杂。优点是,您可以将其与可逆迁移混合使用。 如果你向一个表添加一堆字段并且必须改变视图字段,你可以使用change_tableadd_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

1
投票

可以使用rails 4或rails 5中的change_columns回滚迁移:

def change end

是的,可以使用空(以及正确的非空)change方法回滚迁移。

当你在那里实际拥有某些东西时,如果你没有指定你删除的列的类型,你可能无法使用例如remove_column恢复迁移。

另外,例如,如果你在change_column方法中有change。如果不是来自down方法,Rails应该如何知道更改前列的类型/名称/列数? :)

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


0
投票

你也可以使用

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

保存一些代码。 Activerecord知道如何回滚这个。


-1
投票

使用更改来恢复以前的迁移应该完全没问题。

© www.soinside.com 2019 - 2024. All rights reserved.