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

gab*_*ape 42 rails-migrations ruby-on-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
Run Code Online (Sandbox Code Playgroud)

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

lui*_*7up 70

来自文档:

  def up
    change_column_default :table_name, :status, 0
  end

  def down
    change_column_default :table_name, :status, nil
  end
Run Code Online (Sandbox Code Playgroud)

  • 我想你的意思是为第一个值写`:table_name`而不是`:column_name`.`change_column_default(table_name,column_name,default)public` (2认同)

Ran*_*ili 14

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

def up
  change_column_null :people, :name, true
end

def down
  change_column_null :people, :name, false
end
Run Code Online (Sandbox Code Playgroud)

  • 虽然这段代码可以回答这个问题,但最好解释它是如何解决问题以及为什么要使用它.从长远来看,仅代码的答案无用. (2认同)
  • @TobiasLiefke,因为这个答案是唯一正确的答案,即使是在 7 年后。它解决了问题,删除了 NOT NULL 约束,这与列默认值无关 (2认同)

小智 9

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

class ChangeNameNull < ActiveRecord::Migration
  def change
    change_column_null :people, :name, true
  end
end
Run Code Online (Sandbox Code Playgroud)

编辑1: - 修正错字