如何在Rails中更改列和删除迁移

13 浏览
0 Comments

如何在Rails中更改列和删除迁移

我有一个迁移:

def change
    create_table :m_roles do |t|
      t.string :name, null: false, index: { unique: true }, default: ""
      t.timestamps
    end
  end

模式:

create_table "m_roles", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "name", default: "", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["name"], name: "index_m_groups_on_name", unique: true
  end

我想要将其更改为以下内容:null: false -> null: true 并删除 default: "" 但我不知道新迁移应该写什么:

我尝试了,但没有回滚:

0
0 Comments

问题的出现原因是数据库中已经存在一个名为""的数据,需要手动更新它。解决方法是使用Active Record查询来更新现有的列,并手动指定up和down的操作。另外需要注意的是change_column_null方法,但由于值被设置为空白,不确定是否起作用。

以下是解决方法的具体代码:

def up
    change_column :m_roles, :name, null: true, default: nil
    MRoles.where(name: '').update_all(name: nil)
end
def down
    MRoles.where(name: nil).update_all(name: '')
    change_column :m_roles, :name, null: false, default: ''
end

如果使用change_column_null方法,代码如下:

def change
    change_column_null :m_roles,  :name,   true,       ''
end

以上是关于如何在Rails中更改列和删除迁移的方法。

0