如何在Rails中更改列和删除迁移
如何在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: ""
但我不知道新迁移应该写什么:
我尝试了,但没有回滚:
问题的出现原因是数据库中已经存在一个名为""的数据,需要手动更新它。解决方法是使用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中更改列和删除迁移的方法。