Rails 4:使用迁移从表列中删除非空约束?

时间:2014-04-16 02:38:57

标签: ruby-on-rails-4 rails-migrations

鉴于以下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

我想删除name默认值null: false。我尝试使用change_column_default运行单独的迁移,但这对schema.rb没有影响。有什么建议吗?

4 个答案:

答案 0 :(得分:70)

来自docs

  def up
    change_column_default :table_name, :status, 0
  end

  def down
    change_column_default :table_name, :status, nil
  end

答案 1 :(得分:13)

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

def up
  change_column_null :people, :name, true
end

def down
  change_column_null :people, :name, false
end

答案 2 :(得分:8)

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

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

编辑1: - 修正了拼写错误

答案 3 :(得分:3)

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

将其中包含NULL值的列更改为不允许NULL将导致问题。这正是在开发设置中可以正常工作的代码类型,然后在您尝试将其部署到 LIVE 生产时崩溃。您应该首先将NULL值更改为有效的值,然后然后禁止NULL。 change_column_null中的第4个值就是这样。有关详细信息,请参阅documentation

另外,我通常更喜欢为字段设置默认值,因此每次创建新对象时都不需要指定字段的值。我也包含了注释掉的代码。