2011-12-24 61 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

相关问题