2013-02-06 110 views
2

我運行:默認值

軌產生遷移AddHidemsgColumnToPublishers hide_msg:布爾

和下一個文件的創建:

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

我想設置一個默認值到hide_msg由虛假。

所以我嘗試:

軌產生遷移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' 

回答

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
rake db:migrate 
== AddHidemsgColumnToPublishers: migrating =================================== 
-- add_column(:publishers, :hide_msg, :boolean, {:default=>false}) 

上面的事情意味着它試圖創建colimn這已存在。如果您檢查課程名稱AddHidemsgColumnToPublishers。這意味着它試圖執行您的第一次遷移,其中您沒有default值。這清楚地表明你做錯了什麼。

publishers已經有列hide_msg。因此請檢查db控制檯中的table description。如果您在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

+0

謝謝您的解釋! –