鉴于以下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
没有影响。有什么建议吗?
答案 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。
另外,我通常更喜欢为字段设置默认值,因此每次创建新对象时都不需要指定字段的值。我也包含了注释掉的代码。