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