通过迁移向列添加默认值

如何向通过迁移已经存在的列添加默认值?

我能找到的所有文档都向您展示了如何在列不存在的情况下做到这一点,但在这种情况下它存在。

212116 次浏览

你可以这样做:

class Profile < ActiveRecord::Base
before_save :set_default_val


def set_default_val
self.send_updates = 'val' unless self.send_updates
end
end

编辑:…但显然这是新手犯的错误!

你应该这样做:

change_column :users, :admin, :boolean, :default => false

但是有些数据库(如PostgreSQL)不会更新之前创建的行字段,因此请确保在迁移时也手动更新字段。

change_column_default :employees, :foreign, false

执行:

rails generate migration add_column_to_table column:boolean

它会产生这样的迁移:

class AddColumnToTable < ActiveRecord::Migration
def change
add_column :table, :column, :boolean
end
end

设置默认值adding:default => 1 .单击“添加”

Add_column:table,:column,:boolean,:default =>

运行:

rake db: migrate

使用def change意味着你应该编写可逆的迁移。并且change_column是不可逆的。你可以向上但不能向下,因为change_column是不可逆的。

相反,尽管它可能是额外的几行,但你应该使用def updef 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

对于Rails 4 +,使用change_column_default

def change
change_column_default :table, :column, value
end

* * Rails 4。X + * *

在Rails 4中,你不能生成一个迁移来添加一个列到一个默认值的表中, 以下步骤将向现有表中添加一个默认值为true或false的新列

<强> 1。运行migration from命令行,添加新列

$ 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