2011-12-24 21 views
134

爲布爾我已經看到了一些問題(即this one)在這裏SO有關將默認布爾值現有列。所以我嘗試了change_column的建議,但是我不能這樣做。添加:默認=> true在現有的Rails列

我想:

$ change_column :profiles, :show_attribute, :boolean, :default => true 

它返回-bash: change_column: command not found

我然後跑:

$ rails g change_column :profiles, :show_attribute, :boolean, :default => true 

...和

$ rails change_column :profiles, :show_attribute, :boolean, :default => true 

然後跑rake db:migrate,B對於:show_attribute的值仍然爲nil。在上面引用的問題中,它在PostgreSQL中說你需要手動更新它。由於我使用PostgreSQL我說我create_profiles遷移如下:

t.boolean :show_attribute, :default => true 

有人能告訴我,我做錯了什麼嗎?

回答

283

change_columnActiveRecord::Migration的方法,所以你不能把它像在控制檯中。

如果你想添加一個默認值此列,創建一個新的遷移:在創建的遷移

rails g migration add_default_value_to_show_attribute

然後:

def up 
    change_column :profiles, :show_attribute, :boolean, default: true 
end 

def down 
    change_column :profiles, :show_attribute, :boolean, default: nil 
end 

然後運行rake db:migrate

它不會改變任何東西到已經創建的記錄。要做到這一點,你需要創建一個rake task或只是走在rails console並更新所有記錄。

當您添加t.boolean :show_attribute, :default => truecreate_profiles遷移,如果它沒有做任何事情,這是正常的。只執行尚未運行的遷移。如果您開始使用全新的數據庫,那麼它會將默認值設置爲true。

+2

這change_column呼籲應該在轉移的'up'方法,這是一個新的類,將在db/migrate /中生成。 ('down'方法應該寫成撤銷'up'的操作。)做出這個改變,然後'rake db:migrate'。 – rkb 2011-12-24 22:24:15

+0

啊,這讓rkb更有意義。謝謝! – tvalent2 2011-12-24 22:27:29

+0

直到我寫了'def self.up'和'def self.down',它纔會對我有用。 – 2013-03-04 14:16:51

85

由於上公認的答案的變化,你也可以使用在遷移的change_column_default方法:

def up 
    change_column_default :profiles, :show_attribute, true 
end 

def down 
    change_column_default :profiles, :show_attribute, nil 
end 

Rails API-docs

+1

這可以確保您不會意外更改任何其他列屬性 – 2015-07-27 16:09:28

+0

而在Rails 5中,您離開了_attribute,因此應該只是說'show'或任何列名稱。 – labyrinth 2018-03-06 16:05:41

21

我不知道,當這被寫,但是目前要添加或刪除從遷移的列的默認值,可以使用以下命令:

change_column_null :products, :name, false 

Rails的5:

change_column_default :products, :approved, from: true, to: false 

http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-columns

導軌4。2:

change_column_default :products, :approved, false 

http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns

這是避免翻翻你的遷移或架構列規格的一種巧妙的方法。

+0

請注意,它來自Rails 5文檔。 Rails 4.2版本不接受散列,但是新的默認值是第三個參數。 http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns – Clamoris 2016-07-22 14:11:54

+0

關於Rails 5,兩者似乎都是最正確的方法,例如, 'null:false'和'default :::something'基本上 – Dorian 2017-06-05 22:49:06

相關問題