列的默认值

时间:2013-02-06 16:36:21

标签: ruby-on-rails migration default-value

我跑:

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'

2 个答案:

答案 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