在现有的Rails列中添加:default => true以布尔值
我在这里看到了几个关于在现有列上添加默认布尔值的问题(即这个 )。 所以我尝试了change_column
build议,但是我不能这样做。
我试过了:
$ 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_column
是ActiveRecord::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