Skip to main content

database_uniqueness_enforcement

💾 Enforcing Uniqueness at Database Level​

Model validations can race; always back them with a unique DB index. Wrap creates in a transaction and rescue ActiveRecord::RecordNotUnique to handle concurrent inserts gracefully.

# db/migrate/XXXXXXXXXXXXXX_add_unique_index_to_users_email.rb
tclass AddUniqueIndexToUsersEmail < ActiveRecord::Migration[6.1]
def change
add_index :users, :email, unique: true
end
end

# app/models/user.rb
class User < ApplicationRecord
validates :email, uniqueness: true
end

# Usage
begin
User.create!(email: 'dup@example.com')
rescue ActiveRecord::RecordNotUnique => e
# handle duplicate entry
end