【发布时间】:2011-10-29 05:47:58
【问题描述】:
如何向通过迁移已存在的列添加默认值?
我能找到的所有文档都向您展示了如果该列尚不存在但在这种情况下存在的情况下如何执行此操作。
【问题讨论】:
标签: ruby-on-rails ruby migration
如何向通过迁移已存在的列添加默认值?
我能找到的所有文档都向您展示了如果该列尚不存在但在这种情况下存在的情况下如何执行此操作。
【问题讨论】:
标签: ruby-on-rails ruby migration
这是你可以做的:
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
对于 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 — 但它也不起作用。
change_column_default :employees, :foreign, false
【讨论】:
from: 和 to: :)
from 和 to 被添加到 Rails 5+ 的这个提交中:github.com/rails/rails/pull/20018/files
从 Rails 4 开始,您无法生成迁移以将列添加到具有默认值的表中, 以下步骤将新列添加到现有表中,默认值为 true 或 false。
$ rails generate migration add_columnname_to_tablename columnname:boolean
上述命令将在您的表格中添加一个新列。
class AddColumnnameToTablename < ActiveRecord::Migration
def change
add_column :table_name, :column_name, :boolean, default: false
end
end
$ rake db:migrate
【讨论】:
t.boolean :is_active, :null => false, :default => 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
【讨论】:
你应该这样做:
change_column :users, :admin, :boolean, :default => false
但某些数据库,如 PostgreSQL,不会更新之前创建的行的字段,因此请确保在迁移时也手动更新字段。
【讨论】:
up 块中,而不是 change 块中。您可以将 down 块留空。它不会将表恢复到原始状态,但可以回滚迁移。
执行:
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
运行:
rake db:迁移
【讨论】:
Key is not present in table error。