Skip to content

validates value uniqueness issue  #553

@schinery

Description

@schinery

Given the following:

class Client
  acts_as_paranoid without_default_scope: true

  validates :email, presence: true, uniqueness: { case_sensitive: false }
end

create_table "clients", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
  t.string "email", null: false
  t.datetime "deleted_at"
  t.index "lower((email)::text)", name: "index_clients_on_lower_email", unique: true
end

If I try and create a new client with the same email as a "deleted" client I get the following error:

ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_clients_on_lower_email"
DETAIL:  Key (email)=(foo@example.com) already exists.
)

What I was expecting to happen was that it would trigger an "email is already taken" validation error because I have without_default_scope: true, so it should check against all clients, not just the non-deleted ones.

Is this what should be happening and something is wrong, or am I incorrect and need to do something else to validate against all clients.

I'm using:

Ruby 3.3.0
Rails 7.1.3.2
Paranoia 2.6.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions