如何在迁移文件中使用null => false?

时间:2015-05-27 16:07:49

标签: ruby-on-rails rake

我将create table的迁移文件更改为add column

这是原始迁移文件的一部分。

 create_table(:users) do |t|
      t.string :provider, :null => false
      t.string :uid, :null => false, :default => ""

这是我写的。

    add_column :users, :provider, :string, :null => false
    add_column :users, :uid, :string, :null => false, :default => ""

这是我在运行迁移时遇到的错误。如何更正迁移文件?

== 20150527155909 DeviseTokenAuthCreateUsers: migrating =======================
-- add_column(:users, :provider, :string, {:null=>false})
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::NotNullViolation: ERROR:  column "provider" contains null values
: ALTER TABLE "users" ADD "provider" character varying NOT NULL/***/db/migrate/20150527155909_devise_token_auth_create_users.rb:3:in `change'
ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR:  column "provider" contains null values
: ALTER TABLE "users" ADD "provider" character varying NOT NULL
/home/***/db/migrate/20150527155909_devise_token_auth_create_users.rb:3:in `change'
PG::NotNullViolation: ERROR:  column "provider" contains null values
/home/***/db/migrate/20150527155909_devise_token_auth_create_users.rb:3:in `change'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

1 个答案:

答案 0 :(得分:1)

您正在尝试更新提供程序和uid列以不允许空值,并且您已正确编写了迁移。出现此错误是因为其中一个或多个(至少是提供程序)已包含具有空值的记录。您必须使用空提供程序和/或uid删除记录,或者在它工作之前更新它们的值(从null到#34;")。

注意 如果您想轻松更新这些记录,并且安全性不会阻止您,您只需打开rails控制台并执行以下操作:

users = User.all
users.each do |u|
    u[:provider] = ""
    u[:uid] = ""
    u.save
end

有很多事情可以阻止这种情况发生,它可能没有你想要的结果,但它是一种选择。