【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"