现有列的change_column_null

tva*_*nt2 8 migration ruby-on-rails-3

我试图改变nil现有的列上一个布尔属性的可能性:access_titles:profiles表.由于此迁移,该列存在:

class AddAccessItemsToProfiles < ActiveRecord::Migration
  def self.up
    add_column :profiles, :access_items, :boolean, :default => true
  end

  def self.down
    remove_column :profiles, :access_items, :boolean, :default => nil
  end
end
Run Code Online (Sandbox Code Playgroud)

为了改变nil,我试着像往常一样生成迁移:

rails g migration ChangeColumnNull :profiles :access_items :null => false
Run Code Online (Sandbox Code Playgroud)

但这没有做任何事情,所以我做了一个独立的迁移:

rails g migration AddChangeColumnNullToAccessItems
Run Code Online (Sandbox Code Playgroud)

在那之内我补充说:

class AddChangeColumnNullToAccessItems < ActiveRecord::Migration
  def self.up
    change_column_null :profiles, :access_items, :boolean, false
  end

  def self.down
    change_column_null :profiles, :access_items, :boolean, true
  end
end
Run Code Online (Sandbox Code Playgroud)

然后我跑了rake db:migrate,重新启动了我的服务器,没有看到任何变化.所以我尝试过:

class AddChangeColumnNullToAccessItems < ActiveRecord::Migration
  def self.up
    change_column_null :profiles, :access_items, false
  end

  def self.down
    change_column_null :profiles, :access_items, true
  end
end
Run Code Online (Sandbox Code Playgroud)

然后做了同样的事情:rake db:migrate,重新启动服务器,没有任何改变.

我究竟做错了什么?我希望只有布尔值为:access_itemstrue和false而不必转储数据库.

更新:尝试change_column_null :profiles, :access_items, false我收到一个错误:

-- change_column_null(:profiles, :access_items, false)
rake aborted!
An error has occurred, this and all later migrations canceled:

PGError: ERROR:  column "access_items" contains null values
: ALTER TABLE "profiles" ALTER "access_items" SET NOT NULL
Run Code Online (Sandbox Code Playgroud)

所以,根据下面的建议,我必须插入change_column_null :profiles, :access_items, false, true我的迁移.

Fre*_*ung 27

您可以使用:

change_column_null :profiles, :access_items, false, 1
Run Code Online (Sandbox Code Playgroud)

第四个参数是可选的,允许您设置列的默认值.当列中包含空值并且您将空值设置为时,这是必需的false.

  • 毕竟我不得不添加第四列.再次感谢! (2认同)