Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 Rails 4:通过迁移从表列中删除NOTNULL约束?_Ruby On Rails 4_Rails Migrations - Fatal编程技术网

Ruby on rails 4 Rails 4:通过迁移从表列中删除NOTNULL约束?

Ruby on rails 4 Rails 4:通过迁移从表列中删除NOTNULL约束?,ruby-on-rails-4,rails-migrations,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_numb

给定以下
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\u column\u default
运行单独的迁移,但这对
schema.rb
没有影响。有什么建议吗?

来自:


听起来您并不是要更改列的默认值,而是要删除NOTNULL约束并允许NULL值(即从“NULL:false”更改为默认的“NULL:true”)。如果是这种情况,那么您可以使用:

class ChangeNameNull
编辑1:-固定打字错误

def更改
def change
  change_column_null(:users, :admin, false, <put a default value here> )
  # change_column(:users, :admin, :string, :default => "")
end
更改列\u null(:users,:admin,false) #更改列(:users,:admin,:string,:default=>“”) 结束
将包含NULL值的列更改为不允许NULL将导致问题。这正是在您的开发设置中工作正常,然后在您尝试将其部署到实际生产中时崩溃的代码类型。您应该首先将空值更改为有效值,然后禁止空值。
change\u column\u null
中的第四个值正是这样做的。有关更多详细信息,请参阅


此外,我通常更喜欢为字段设置一个默认值,这样我就不需要在每次创建新对象时指定字段的值。我也加入了注释掉的代码来完成这项工作。

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

def up
  change_column_null :people, :name, true
end

def down
  change_column_null :people, :name, false
end

它已经在生产了吗?否则,您可以简单地回滚并手动删除默认设置。@rails4guides.com这就是我最后要做的。我想可能有更好的方法。可能是重复的。我想您是想为第一个值编写
:table\u name
,而不是
:column\u name
change\u column\u default(table\u name,column\u name,default)public
虽然这段代码可以回答这个问题,但最好解释一下它是如何解决问题的,以及为什么要使用它。从长远来看,纯代码的答案是没有用的。你能补充一个解释吗?有什么区别吗?指更改列的默认值。我的答案设置此列是否允许空值。
def change
  change_column_null(:users, :admin, false, <put a default value here> )
  # change_column(:users, :admin, :string, :default => "")
end
def up
  change_column_null :people, :name, true
end

def down
  change_column_null :people, :name, false
end