2

我跑:

rails 生成迁移 AddHidemsgColumnToPublishers hide_msg:boolean

并创建了下一个文件:

class AddHidemsgColumnToPublishers < ActiveRecord::Migration
  def change
    add_column :publishers, :hide_msg, :boolean
  end
end

我想将默认值设置为hide_msgfalse。

所以我尝试了:

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'
4

2 回答 2

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
于 2013-02-06T17:02:13.747 回答
1
rake db:migrate
==  AddHidemsgColumnToPublishers: migrating ===================================
-- add_column(:publishers, :hide_msg, :boolean, {:default=>false})

上面的东西意味着它试图创建已经存在的colimn。如果你检查类名AddHidemsgColumnToPublishers。这意味着它会尝试执行您没有default价值的第一次迁移。这清楚地表明你做错了什么。

publishers已经有列hide_msg。所以检查控制台table descriptiondb如果您没有任何值,hide_msg那么您可以手动drop列并重新运行rake db:migrate. 或者,您可以保持该列不变,然后创建迁移以添加default value.

change_column_default :publishers, :hide_msg, false

文档:http ://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default

于 2013-02-06T16:39:19.317 回答