ruby-on-rails 如何在Rails迁移中 * 可逆地 * 删除'change_table'中的列?

tquggr8v  于 2022-11-19  发布在  Ruby
关注(0)|答案(2)|浏览(143)

我知道我可以在change迁移中做到这一点,并使其可逆:

add_column :widgets, :color, :string
  remove_column :widgets, :flavor, :string

但奇怪的是,change_table-〉remove并不是这样工作的,它取的不是params (name, type),而是列名的列表(如果试图追加类型参数,它会被解释为列名)。

change_table(:widgets) do |t|
    t.column :color, :string
    t.remove :flavor, :string    # <-- nope! It tries to remove a column named "string"
  end

当您尝试这样做时,会出现以下错误:

remove_columns is only reversible if given a type.

是不是还有另一个我忽略的调用?change_table可能会遗漏这样一个基本用例,这似乎很奇怪,但我在the docs中没有看到任何可以做到这一点的调用。

ny6fqffe

ny6fqffe1#

在实验过程中,我尝试了以下方法,效果很好:

change_table(:widgets) do |t|
    t.column :color, :string
    t.remove :flavor, type: :string
                     #^^^^^
  end

所以我想这就是答案。

06odsfpq

06odsfpq2#

ActiveRecord::ConnectionAdapters::Table通常只是ActiveRecord::ConnectionAdapters::SchemaStatements周围的一个薄 Package 器-在本例中,remove_columns采用列列表和选项散列。
可以传递类型和其他列选项以使迁移可逆。

remove_columns(:suppliers, :qualification, :experience, type: :string, null: false)

remove实际上只提供了第一个参数,即表。

相关问题