在现有的Rails列中添加:default => true以布尔值

我在这里看到了几个关于在现有列上添加默认布尔值的问题(即这个 )。 所以我尝试了change_columnbuild议,但是我不能这样做。

我试过了:

 $ 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 ,但是:show_attribute的值保持nil 。 在上面引用的问题中,它在PostgreSQL中说你需要手动更新它。 由于我使用PostgreSQL,我在create_profiles迁移中添加了以下内容:

 t.boolean :show_attribute, :default => true 

有人能告诉我我在做什么错吗?

change_columnActiveRecord::Migration一个方法,所以你不能在控制台中这样调用它。

如果要为此列添加默认值,请创build一个新的迁移:

rails g migration add_default_value_to_show_attribute

然后在创build的迁移中:

 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

它不会改变已经创build的logging。 要做到这一点,你将不得不创build一个rake task或者只是在rails console并更新所有的logging。

当你添加t.boolean :show_attribute, :default => true的时候,如果没有做任何事情,这是正常的。 只有尚未运行的迁移才会执行。 如果你开始一个新的数据库,那么它将默认设置为true。

作为接受的答案的变体,您也可以在迁移中使用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文档

我不确定何时写入,但是当前要在迁移中添加或删除列中的缺省值,可以使用以下命令:

 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

Rails 4.2:

 change_column_default :products, :approved, false 

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

这是避免查看您的迁移或模式列规范的一种很好的方法。

 change_column :things, :price_1, :integer, default: 123, null: false 

似乎是将缺省值添加到不具有null: false的现有列的​​最佳方法。

除此以外:

 change_column :things, :price_1, :integer, default: 123 

我在这方面做了一些研究:

https://gist.github.com/Dorian/417b9a0e1a4e09a558c39345d50c8c3b