我本来这种迁移:轨移民工作唯一真实的,但允许空值
def change
add_column :users, :provider, :string, null: false, default: "email"
add_column :users, :uid, :string, null: false, default: ""
add_index :users, [:uid, :provider], unique: true
end
但在我的应用程序,用户可以使用两个omniauth和用户名和密码,而不OAuth认证登录。因此,在许多情况下,uid和提供者将为空。所以,我创建了以下迁移:
def change
change_column_default :users, :provider, nil
change_column_default :users, :uid, nil
end
但是,当我尝试设置提供商或UID在Rails的零,我得到一个PG::NotNullViolation: ERROR
:
u = User.first
u.provider = nil
u.save!
(0.4ms) BEGIN
SQL (1.5ms) UPDATE "users" SET "updated_at" = $1, "provider" = $2 WHERE "users"."id" = $3 [["updated_at", 2017-08-16 00:01:34 UTC], ["provider", nil], ["id", 1]]
(0.5ms) ROLLBACK
ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR: null value in column "provider" violates not-null constraint
DETAIL: Failing row contains
看来unique: true
在迁移防止设置空值。我怎样才能解决这个问题?
对于{:null => true},未定义的方法'to_sym':使用change_column时的哈希:users,:provider,null:true – Donato
我编辑了我的答案。请立即检查,如果您使用rails 4.x版本,它应该可以正常工作。 – harika