我跑:
rails生成迁移AddHidemsgColumnToPublishers hide_msg:boolean
并创建了下一个文件:
class AddHidemsgColumnToPublishers < ActiveRecord::Migration
def change
add_column :publishers, :hide_msg, :boolean
end
end
我想将默认值设置为hide_msg
为假。
所以我试过了:
rails生成迁移add_default_value_to_hide_msg
class AddDefaultValueToHideMsg < ActiveRecord::Migration
def up
change_column :publishers, :hide_msg, :boolean, :default => false
end
def down
change_column :publishers, :hide_msg, :boolean, :default => nil
end
end
但我收到了错误:
rake db:migrate
== AddHidemsgColumnToPublishers: migrating ===================================
-- add_column(:publishers, :hide_msg, :boolean, {:default=>false})
rake aborted!
An error has occurred, this and all later migrations canceled:
PG::Error: ERROR: column "hide_msg" of relation "publishers" already exists
: ALTER TABLE "publishers" ADD COLUMN "hide_msg" boolean DEFAULT 'f'
答案 0 :(得分:5)
只是一个建议....不要在数据库中设置默认值,因为如果你想在后面更改它可能会遇到一些问题。
我认为如果你在你的模型中设置它会更好。
before_save :set_default_high_msg
def set_default_high_msg
self.high_msg ||= false
end
甚至在您的控制器中:
def new
@publisher = Publisher.new
@publisher.high_msg ||= false
...
end
答案 1 :(得分:1)
rake db:migrate
== AddHidemsgColumnToPublishers: migrating ===================================
-- add_column(:publishers, :hide_msg, :boolean, {:default=>false})
上面的东西意味着它试图创建已经存在的colimn。如果您检查班级名称AddHidemsgColumnToPublishers
。这意味着它尝试执行您没有default
值的第一次迁移。这清楚地表明你做错了什么。
publishers
已有列hide_msg
。因此,请检查table description
控制台中的db
。如果您在hide_msg
中没有任何值,则可以手动drop
该列并重新运行rake db:migrate
。或者您可以按原样保留该列,只需创建迁移即可添加default value
。
change_column_default :publishers, :hide_msg, false
Doc:http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default