如何通过迁移向已存在的列添加默认值?
我可以找到的所有文档都向您展示了如果该列尚不存在但在这种情况下存在的情况下如何执行此操作。
这是你应该如何做的:
change_column :users, :admin, :boolean, :default => false
但是一些数据库,比如 PostgreSQL,不会更新之前创建的行的字段,所以请确保在迁移时手动更新字段。
change_column_default :employees, :foreign, false
from:
和 to:
:)
对于 Rails 4+,请使用 change_column_default
def change
change_column_default :table, :column, value
end
def change
` add_column :foos, :name, default: "something for existing values"` ` change_column_default :foos, :name, default: ""` end
change_column_default :products, :approved, from: true, to: false
— 但它也不起作用。
使用 def change
意味着您应该编写可逆的迁移。并且 change_column
是不可逆的。你可以上升,但你不能下降,因为 change_column
是不可逆的。
相反,虽然它可能是几行额外的行,但您应该使用 def up
和 def down
因此,如果您有一列没有默认值,那么您应该这样做以添加默认值。
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: nil
end
或者,如果您想更改现有列的默认值。
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: true
end
**导轨 4.X +**
从 Rails 4 开始,您无法生成迁移以将列添加到具有默认值的表中,以下步骤将新列添加到具有默认值 true 或 false 的现有表中。
1. 从命令行运行迁移以添加新列
$ rails generate migration add_columnname_to_tablename columnname:boolean
上面的命令将在您的表中添加一个新列。
2. 通过编辑创建的新迁移文件将新列值设置为 TRUE/FALSE。
class AddColumnnameToTablename < ActiveRecord::Migration
def change
add_column :table_name, :column_name, :boolean, default: false
end
end
**3。要对您的应用程序数据库表进行更改,请在终端中运行以下命令**
$ rake db:migrate
t.boolean :is_active, :null => false, :default => false
执行:
rails generate migration add_column_to_table column:boolean
它将生成此迁移:
class AddColumnToTable < ActiveRecord::Migration
def change
add_column :table, :column, :boolean
end
end
设置默认值添加 :default => 1
add_column :table, :column, :boolean, :default => 1
跑:
耙分贝:迁移
Key is not present in table error
。
这是你可以做的:
class Profile < ActiveRecord::Base
before_save :set_default_val
def set_default_val
self.send_updates = 'val' unless self.send_updates
end
end
编辑:......但显然这是一个新秀错误!
before_save
up
块而不是change
块中。您可以将down
块留空。它不会将表恢复到原始状态,但可以回滚迁移。