gpt4 book ai didi

ruby-on-rails - rails migration unique true 但允许空值

转载 作者:行者123 更新时间:2023-11-29 13:47:41 24 4
gpt4 key购买 nike

我最初有这个迁移:

  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

但在我的应用程序中,用户可以在没有 oauth 身份验证的情况下使用 omniauth 和用户名和密码登录。因此,在许多情况下,uid 和 provider 将为空。所以我创建了以下迁移:

  def change
change_column_default :users, :provider, nil
change_column_default :users, :uid, nil
end

但是当我尝试在 Rails 中将提供者或 uid 设置为 nil 时,我得到一个 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: false,这导致了 PG::NotNullViolation 异常。需要将其设置为 true 以允许两列中的空值。编写新迁移以设置 null: true 应该可以解决问题,如下所示。

def change
change_column_null :users, :provider, true
change_column_null :users, :uid, true
end

此外,索引下方可能不起作用(RecordNotUnique 异常引发,因为它设置为唯一:true),因为您将有多个行同时具有 uid 和 provider 的空值。所以这个索引需要被删除。

add_index :users, [:uid, :provider], unique: true

关于ruby-on-rails - rails migration unique true 但允许空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45715829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com