Rails 4:如何改变表列的默认值与迁移?

鉴于以下schema.rb

  create_table "people", force: true do |t| t.string "name", null: false t.integer "age" t.integer "height" t.string "email" t.boolean "married", default: false t.text "bio" t.integer "fav_number" t.decimal "lucky_num", precision: 2, scale: 2 t.datetime "birthday" t.datetime "created_at" t.datetime "updated_at" end 

我想删除null: falsename默认值。 我试过用change_column_default运行一个单独的迁移,但是这对schema.rb没有影响。 有什么build议么?

从文档 :

  def up change_column_default :table_name, :status, 0 end def down change_column_default :table_name, :status, nil end 

当你执行db:migrate时,'up'函数肯定会完成这项工作。
但是在将来,在某些情况下,如回滚,您可能需要一个函数来反转这个特定的迁移。

 def up change_column_null :people, :name, true end def down change_column_null :people, :name, false end 

这听起来像你不是试图改变列的默认值,而是删除NOT NULL约束并允许空值(即从“null:false”更改为默认“null:true”)。 如果是这种情况,那么你可以使用change_column_null :

 class ChangeNameNull < ActiveRecord::Migration def change change_column_null :people, :name, true end end 

编辑1: – 修正了错字

 def change change_column_null(:users, :admin, false, <put a default value here> ) # change_column(:users, :admin, :string, :default => "") end 

更改一个列中的NULL值不允许NULL将导致问题。 这正是在开发环境中能够正常工作的代码types,然后当你尝试将其部署到实际的生产环境时,就会崩溃。 您应该首先将NULL值更改为有效, 然后禁止NULL。 change_column_null中的第四个值就是这个值。 请参阅文档了解更多详情。

此外,我通常更喜欢设置字段的默认值,所以我不需要每次创build一个新的对象时指定字段的值。 我还包括注释掉的代码来做到这一点。