【Rails】メールアドレスのユニーク制約時 modelとデータベースでのlogの違い

メールアドレスのユニーク制約時に、modelとデータベースで発生するlogの違いを見たいと思い実験をした。

modelでのユニーク制約時

user.rbに記載↓

validates :email,  uniqueness: true

ターミナル上でrails consoleを利用してデータの登録↓

irb(main):001:0> User.create(name: "test01", email: "test01@example.com", password_digest: "password")
   (0.1ms)  BEGIN
  User Exists (0.6ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "test01@example.com"], ["LIMIT", 1]]
  User Create (0.6ms)  INSERT INTO "users" ("name", "email", "password_digest", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "test01"], ["email", "test01@example.com"], ["password_digest", "password"], ["created_at", "2021-08-08 10:28:17.183847"], ["updated_at", "2021-08-08 10:28:17.183847"]]
   (0.4ms)  COMMIT
=> #<User id: 1, name: "test01", email: "test01@example.com", password_digest: "password", created_at: "2021-08-08 10:28:17", updated_at: "2021-08-08 10:28:17">

もう一度同じメールアドレスで登録を試みると、ROLLBACKが発生↓

irb(main):002:0> User.create(name: "test01", email: "test01@example.com", password_digest: "password")
   (0.2ms)  BEGIN
  User Exists (0.4ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "test01@example.com"], ["LIMIT", 1]]
   (0.3ms)  ROLLBACK
=> #<User id: nil, name: "test01", email: "test01@example.com", password_digest: "password", created_at: nil, updated_at: nil>

エラーメッセージはこちら↓

=> {:email=>["has already been taken"]}

データベースでのユニーク制約時

db/schema.rbの中身↓

ActiveRecord::Schema.define(version: 2021_08_08_091127) do
  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.string "password_digest"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
  end
end

user.rbに記載↓したこちらのコードは、データベースでのユニーク制約時のlogが見たいので削除

validates :email,  uniqueness: true

ターミナル上でrails consoleを利用してデータの登録↓をしたが、ActiveRecord::RecordNotUniqueが発生

irb(main):001:0> User.create(name: "test01", email: "test01@example.com", password_digest: "password")
   (0.1ms)  BEGIN
  User Create (5.0ms)  INSERT INTO "users" ("name", "email", "password_digest", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "test01"], ["email", "test01@example.com"], ["password_digest", "password"], ["created_at", "2021-08-08 10:36:02.801059"], ["updated_at", "2021-08-08 10:36:02.801059"]]
   (0.2ms)  ROLLBACK
Traceback (most recent call last):
        1: from (irb):1
ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_users_on_email")
DETAIL:  Key (email)=(test01@example.com) already exists.
: INSERT INTO "users" ("name", "email", "password_digest", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"